【问题标题】:Call exe in Inno Setup uninstall在 Inno Setup 卸载中调用 exe
【发布时间】:2012-11-16 16:34:40
【问题描述】:

我对 Inno Setup 卸载程序有疑问。我有一个要执行以跟踪安装和卸载的 exe 文件。 exe非常简单,向服务器发送消息。

[Files]
Source: "Tracker\LocalSandboxInstallTracker.exe"; DestDir: "{app}/Tracker";
Source: "Tracker\LocalSandboxInstallTracker.exe.config"; DestDir: "{app}/Tracker";
Source: "Tracker\Tracker.Client.dll"; DestDir: "{app}/Tracker";

[Run]
Filename: "{app}\Tracker\LocalSandboxInstallTracker.exe"; Parameters: " {#MyAppVersion} install"; Flags: runhidden; StatusMsg: "Sending tracking data..."

[Code]
procedure InitializeUninstallProgressForm();
var
  ResultCode: Integer;
begin
  Exec ('{app}\Tracker\LocalSandboxInstallTracker.exe',' {#MyAppVersion} uninstall','',SW_SHOW, ewWaitUntilTerminated, ResultCode);
end;

安装时调用运行良好,但卸载时调用不正常。我在我的 Exec 命令上放置了一个断点,它确实通过了那里,但似乎没有调用 exe。

【问题讨论】:

  • 什么返回 Exec 函数,True 还是 False?调用后ResultCode 的值是多少?
  • Exec之前ResultCode为0,之后为267。
  • 您确实意识到该应用会触发恶意软件/间谍软件和防火墙,对吧?而且您使用runhidden 这样做的事实看起来非常可疑?我建议人们不要安装它,因为它看起来可能是恶意行为。

标签: inno-setup uninstallation pascal


【解决方案1】:

在将{app} 常量传递给Exec 脚本函数之前,您必须对其进行扩展。每当您需要获取常量的值时,请使用ExpandConstant。用这种方式修改你的脚本:

Exec(ExpandConstant('{app}\Tracker\LocalSandboxInstallTracker.exe'), 
  '{#MyAppVersion} uninstall', '', SW_SHOW, 
  ewWaitUntilTerminated, ResultCode);

另外,您应该检查函数结果和输出结果代码以在Exec 函数失败时做出反应。您将在 ResultCode 中获得的错误代码您可以检查 System Error Codes 参考或使用 SysErrorMessage(ResultCode) 从脚本中获取错误描述。

【讨论】:

  • 很好,它有效。错误 267 = 无效的目录名称,它是合适的。
  • 没错!老实说,我在第一次观看时也忽略了这一点。当您告诉我错误代码时,我立即意识到目录有问题。
  • 另请注意,您应该从CurUninstallStepChanged(usUninstall) 调用它,因为这是实际卸载实际开始的时间。 (在此之前,它有可能被取消。)还请注意,可能不需要在{#MyAppVersion} 上使用ExpandConstant,因为它是在编译时而不是运行时扩展的。 (仅当扩展本身产生运行时扩展所需的值时才需要它。)
  • 关于CurUninstallStepChanged(usUninstall) 的优点。是的,预处理器定义不需要ExpandConstant,它们当然是由预处理器本身扩展的。
【解决方案2】:

如果你想在 Exec 调用中使用像 {app} 这样的常量,你必须调用 ExpandConstant 函数:

[Code]
procedure InitializeUninstallProgressForm();
var
  ResultCode: Integer;
begin
  Exec (ExpandConstant('{app}\Tracker\LocalSandboxInstallTracker.exe')
    ,' {#MyAppVersion} uninstall','',SW_SHOW, ewWaitUntilTerminated, ResultCode);
end;

否则,您无法找到 exe。

【讨论】:

    猜你喜欢
    • 2018-05-04
    • 2017-08-15
    • 2011-12-06
    • 2021-01-07
    • 2013-03-28
    • 2016-01-14
    • 2015-08-31
    • 1970-01-01
    • 2016-09-27
    相关资源
    最近更新 更多