我发现a solution通过使用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
的常量 - 如果整个函数失败,这是我自己的错误代码。我不相信编译器应该抱怨这个,但我可能是错的。我总是消灭所有编译器提示和警告,但在这种情况下,编译器更像是一个抱怨者。
这是编译器中的侥幸,还是代码中有问题?
答案 0 :(得分:5)
编译器是正确的,代码中有错误。 : - )
如果函数有效,函数将返回UNZIP_SUCCESS
,如果引发异常,则返回GetLastError
的结果。因此,第一次赋值给Result
是不必要的 - 没有执行路径会导致UNZIP_FAIL
被返回。
答案 1 :(得分:4)
如果删除第一行result
分配,则没有执行路径使result
未分配。因此,永远不会返回UNZIP_FAIL
值。