我找到了一种解决方案,可以通过使用OLE创建DLL来提取zip文件的内容。我自己触摸了此功能,但是由于某种原因,编译器抱怨该功能的结果从未使用...
library unzipper;
{
title : UnZip for InnoSetup
version : 1.0
author : Daniel P. Stasinski
email : daniel@genericinbox.com
begin : Fri Nov 22 17:31:33 MST 2013
license : None
}
uses
Windows,
SysUtils,
ComObj;
const
SHCONTCH_NOPROGRESSBOX = 4;
SHCONTCH_AUTORENAME = 8;
SHCONTCH_RESPONDYESTOALL = 16;
SHCONTF_INCLUDEHIDDEN = 128;
SHCONTF_FOLDERS = 32;
SHCONTF_NONFOLDERS = 64;
UNZIP_SUCCESS = 0;
UNZIP_FAIL = -1;
function UnzipFile(ZipFile, TargetFolder: WideString): Integer; stdcall;
var
shellobj: variant;
ZipFileV, SrcFile: variant;
TargetFolderV, DestFolder: variant;
shellfldritems: variant;
begin
Result:= UNZIP_FAIL;
try
shellobj := CreateOleObject('Shell.Application');
ZipFileV := string(ZipFile);
TargetFolderV := string(TargetFolder);
SrcFile := shellobj.NameSpace(ZipFileV);
DestFolder := shellobj.NameSpace(TargetFolderV);
shellfldritems := SrcFile.Items;
DestFolder.CopyHere(shellfldritems, SHCONTCH_NOPROGRESSBOX or SHCONTCH_RESPONDYESTOALL);
Result:= UNZIP_SUCCESS;
except
on e: exception do begin
Result:= GetLastError;
end;
end;
end;
exports
UnzipFile;
begin
end.
它给了我消息...
[DCC提示] unzipper.dpr(35):H2077值分配给" Unzipfile"从未使用过
这是来自该函数中的第一行代码,我将其初始化为-1
的常数 - 如果整个函数失败,这是我自己的错误代码。我不认为编译器应该抱怨这一点,但我可能错了。我总是消除所有编译器的提示和警告,但是在这种情况下,编译器更像是投诉者。
这是编译器中的fluke,还是代码中有问题?
编译器是正确的,并且代码中有问题。: - )
如果起作用,该函数将返回UNZIP_SUCCESS
,或者如果提出异常,则GetLastError
的结果。因此,对Result
的第一个分配是不必要的 - 没有执行途径会导致UNZIP_FAIL
返回。
如果您删除了第一行result
分配,则没有执行路径不会使result
未分配。因此,UNZIP_FAIL
值将永远不会返回。