【问题标题】:UnZip files after install with InnoUnzip - Error "Invalid prototype"使用 InnoUnzip 安装后解压缩文件 - 错误“无效原型”
【发布时间】:2015-04-06 10:41:37
【问题描述】:

unpacker 我找到了我要找的东西,他应该在安装后解压文件 这是InnoUnzip.ZIP

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

我的代码:

[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;

文本错误:“Extract Me”的原型无效

【问题讨论】:

  • 您正在使用 Unicode Inno 安装程序,该安装程序需要该 AfterInstall 原型的 Unicode 字符串。使用这个procedure ExtractMe(src, target: string);。然后,当您将这些参数传递给插件类型转换unzip(AnsiString(ExpandConstant(src)), AnsiString(ExpandConstant(target))); 时。无论如何,那个插件有点懒惰,我相信它的整个代码可以直接从 Inno Setup 脚本执行。

标签: inno-setup pascalscript


【解决方案1】:

继续 TLama 关于 DLL 冗余的观点:只需在 Inno Setup 脚本中直接编码 UnZip() 即可实现相同的效果。

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;

Inno Setup 脚本代码或多或少与 DLL 的相同...只是更短一些。

请注意,如果 Zip 或 Destination 文件夹不存在,NameSpace() 方法调用会返回 NullCopyHere() 会失败,并且用户会看到一个粗鲁且令人费解的对话框 - 所以最好在调用之前检查一下.

【讨论】:

  • 我在 Windows 10 的安装程序中使用了您的代码,它的工作原理非常棒,谢谢。但是,它在 Windows 7 上不起作用。安装完成且没有错误,但未解压缩 zip。我检查了 innosetup 编译器,所有变量都有正确的值。一切似乎都与我在 Windows 10 上的测试相同。知道问题所在吗?
  • @Dulkan:我已经在 W7 和 W8 下对此进行了测试,并且在两者上都运行良好(我记得因为 W8 可以在解压缩时生成一个性感的进度图,而 W7 是一个不那么性感的对话框)。所以我很困惑。它应该去。如果你运行它显示进度框,你看到什么了吗?这种方法取决于外壳提取 Zips 的能力 - 我认为这在目标 W7 机器上运行良好?例如,我猜一个损坏的 WinZip 副本可能会杀死它?
  • 嗯,这可能是。 Win7机器使用WinRAR,是一个简单的测试机器,经常被格式化。可能那里没有安装基本的winzip?使用进度框,也没有任何反应,安装程序在目录中安装 zip 文件后立即完成安装。
  • @Dulkan:一个简单的机器就可以了。但我怀疑正在发生的事情是 WinRAR 正在自行承担通常由资源管理器处理的 zip 扩展任务,然后将它们启动。你能在干净的 W7 机器上测试你的安装程序吗?
  • 我在 Win10 机器上再次尝试了它,没有安装 WinRAR 或任何类似的东西,安装程序表现出完全相同的行为。我有几个理论。 1) 提供给我的文件现在是 rar 而不是 zip,我只是将其重命名为 zip,因为当我提供 rar 文件时,安装程​​序会引发异常。 2)目前我无法在win10 64位机器上编写和编译安装程序。我是在win7 32位机器上这样做的。这会导致一些问题吗?无论哪种方式,解决方案对我来说似乎都相当脆弱。虽然我很困惑,但一开始它就像一种魅力。
【解决方案2】:

将参数类型 AnsiString 更改为 String。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多