Inno setup 使用InnoUnzip安装后解压缩文件-错误";“无效原型”;

Inno setup 使用InnoUnzip安装后解压缩文件-错误";“无效原型”;,inno-setup,pascalscript,Inno Setup,Pascalscript,解包我找到了我要找的东西,他应该在安装后解包 这是 我的安装程序文件夹如下所示: 我的代码: [Setup] AppName=My Program AppVersion=1.0 DefaultDirName={pf}\My Program DisableProgramGroupPage=yes UninstallDisplayIcon={app}\MyProg.exe OutputDir=userdocs:Inno Setup Examples Output [Files] Source:

解包我找到了我要找的东西,他应该在安装后解包 这是

我的安装程序文件夹如下所示:

我的代码:

[Setup]
AppName=My Program
AppVersion=1.0
DefaultDirName={pf}\My Program
DisableProgramGroupPage=yes
UninstallDisplayIcon={app}\MyProg.exe
OutputDir=userdocs:Inno Setup Examples Output

[Files]
Source: "unzipper.dll"; Flags: dontcopy
Source: "MyProg.exe"; DestDir: "{app}"
Source: "Somefile.zip"; DestDir: "{app}"; AfterInstall: ExtractMe('{app}\Somefile.zip', '{app}');

[Icons]
Name: "{commonprograms}\My Program"; Filename: "{app}\MyProg.exe"
Name: "{commondesktop}\My Program"; Filename: "{app}\MyProg.exe"

[Code]
procedure unzip(src, target: AnsiString);
external 'unzip@files:unzipper.dll stdcall delayload';

procedure ExtractMe(src, target : AnsiString); - ERROR HERE!!!!!
begin
  unzip(ExpandConstant(src), ExpandConstant(target));
end;

文本错误:将参数类型AnsiString更改为字符串时,“提取我”的原型无效

跟进TLama关于DLL冗余的观点:只需直接在Inno设置脚本中编写
UnZip()
代码,即可实现相同的效果。

Inno设置脚本代码与DLL的基本相同。。。只短一点


请注意,如果Zip或目标文件夹不存在,
NameSpace()
方法调用将返回一个
Null
,而
CopyHere()将失败,用户会看到一个粗鲁而令人困惑的对话框,因此最好在呼叫前检查。

您使用的是Unicode Inno安装程序,该程序在安装后需要一个Unicode字符串。使用这个
过程ExtractMe(src,target:string)。然后将这些参数传递给插件typecast
unzip(AnsiString(ExpandConstant(src)),AnsiString(ExpandConstant(target))。无论如何,这个插件有点懒惰,我相信整个its代码可以直接从Inno安装脚本执行。我在Windows10的安装程序中使用了你的代码,它工作得很好,谢谢。但是,它在Windows7上不起作用。安装完成,没有错误,但未提取zip。我检查了innosetup编译器,所有变量都有正确的值。所有内容都与我在Windows 10上的测试完全相同。知道问题出在哪里吗?@Dulkan:我在W7和W8下测试过,两个版本都可以(我记得,因为W8可以在解压时生成性感的进度图,而W7则是一个不那么性感的对话框)。所以我很困惑。应该走了。如果你运行它,显示进度框,你看到什么了吗?这种方法取决于shell提取拉链的能力——我想这在目标W7机器上运行正常吗?例如,我想一个坏掉的WinZip副本可能会杀死它?嗯,这可能是。Win7机器使用WinRAR,是一台基本测试机器,经常格式化。可能那里没有安装基本的winzip?使用“进度”框,也不会发生任何事情,安装程序在目录中安装zip文件后,安装立即完成。@Dulkan:裸骨机器就可以了。但我怀疑正在发生的事情是WinRAR正在自行完成通常由Explorer处理的zip扩展任务,然后将它们搞糟。你能在一台干净的W7机器上测试你的安装程序吗?我又在一台Win10机器上测试了一遍,没有安装WinRAR或任何类似的东西,安装程序表现出完全相同的行为。我有几个理论。1) 现在提供给我的文件是rar而不是zip,我只是将其重命名为zip,因为当我提供rar文件时,安装程序会抛出一个异常。2) 目前我没有权限在win10 64位机器上编写和编译安装程序。我是在Win32位机器上这样做的。这会引起一些问题吗?不管怎样,这个解决方案对我来说都相当脆弱。虽然我很困惑,但一开始它就像一个符咒。
const
  SHCONTCH_NOPROGRESSBOX = 4;
  SHCONTCH_RESPONDYESTOALL = 16;

procedure Unzip(ZipFile, TargetFolder: String); 
var
  ShellObj, SrcFile, DestFolder: Variant;
begin
  ShellObj := CreateOleObject('Shell.Application');
  SrcFile := ShellObj.NameSpace(ZipFile);
  DestFolder := ShellObj.NameSpace(TargetFolder);
  DestFolder.CopyHere(SrcFile.Items, SHCONTCH_NOPROGRESSBOX or SHCONTCH_RESPONDYESTOALL)
end;

procedure ExtractMe(src, target : String); 
begin
  // Add extra application code here, then:
  Unzip(ExpandConstant(src), ExpandConstant(target));
end;