【问题标题】:inno issue: Unable to execute file retrieved from RegQueryStringValue无问题:无法执行从 RegQueryStringValue 检索的文件
【发布时间】:2018-07-13 14:57:37
【问题描述】:

执行/运行以下 Inno 代码,我收到错误消息。文件“c:\xxxx-runtime\unins000.exe”确实存在。

错误信息:

Unable to execute file:
"c:\xxxx-runtime\unins000.exe"
CreateProcess failed; code 267.
The directory name is invalid.

Inno 代码如下所示:

[UninstallRun]
Filename: "{code:ARGetUninstallString}";
;Filename: {code:ARGetUninstallString};   -- same result

[Code]
function ARGetUninstallString(p: String): String;
var
  sUnInstPath: String;
  sUnInstallString: String;
begin
  sUnInstPath := ExpandConstant('Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\xxxx_is1');
  sUnInstallString := '';
  if not RegQueryStringValue(HKEY_LOCAL_MACHINE, sUnInstPath, 'UninstallString', sUnInstallString) then
    RegQueryStringValue(HKEY_CURRENT_USER, sUnInstPath, 'UninstallString', sUnInstallString);
  Result := sUnInstallString;
end;

但是,如果我更换它就可以正常工作

[UninstallRun]
Filename: "{code:ARGetUninstallString}";

[UninstallRun]
Filename: "c:\xxxx-runtime\unins000.exe";

有没有 Inno 专家知道问题出在哪里?

【问题讨论】:

  • 请注意,在有关此主题的所有现有问题中,UninstallString 是如何拆分为程序路径和参数的。程序路径用双引号括起来,需要删除。
  • 感谢您的评论,马丁。我发现了问题 - 在我的脚本 [Run] 部分中,我安装了一个将写入注册表的应用程序。 [UninstallRun] 实际上在安装过程中执行,此时 [Run] 部分中的应用程序尚未执行,因此 reg 未更新。 sUnInstallString(或结果)包含空字符串。我仍在努力寻找解决方案。

标签: inno-setup pascal


【解决方案1】:

如您所见,{code:} 常量在安装时进行评估。

因此,请在 [Code] 部分中完全实现您的代码,而不是使用 [UninstallRun] 部分。

[Code]

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  if CurUninstallStep = usPostUninstall { or usUninstall } then
  begin
    { Use RegQueryStringValue and Exec here }
  end;
end;

尽管您需要修复为卸载程序解析命令行的代码。请注意,在有关此主题的所有现有问题中,UninstallString 是如何拆分为程序路径和参数的。程序路径用双引号括起来,需要删除。

Executing UninstallString in Inno Setup

【讨论】:

    【解决方案2】:

    以下是我的解决方案,基本上是在从reg获取路径之前先执行[code]部分的xxxxx-runtime.exe。以下是源代码:

    [Files]              
    Source: ".\xxxxx-runtime.exe"; DestDir: "{tmp}"; Flags: deleteafterinstall
    
    [UninstallRun]
    Filename: {code:GetUninstallString}; BeforeInstall: SetUninstallString; RunOnceId: {code:GetUninstallString}
    
    [Code]
    var
    uninstallString: String;
    
    function getUninstallString(p: String): String;
    begin
      Result := uninstallString;
    end;
    
    // execute xxxxx-runtime.exe
    procedure exe();
    var
      iResultCode: Integer;
    begin
      Exec(ExpandConstant('{tmp}\xxxxx-runtime.exe'), '/SILENT /NORESTART /SUPPRESSMSGBOXES','', SW_HIDE, ewWaitUntilTerminated, iResultCode);
    end;
    
    procedure SetUninstallString();
    var
      sUnInstPath: String;
      sUnInstallString: String;
    begin
      exe();
      sUnInstPath := ExpandConstant('Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\xxxxx_is1');
      sUnInstallString := '';
      if not RegQueryStringValue(HKEY_LOCAL_MACHINE, sUnInstPath, 'UninstallString', sUnInstallString) then
        RegQueryStringValue(HKEY_CURRENT_USER, sUnInstPath, 'UninstallString', sUnInstallString);
      uninstallString := RemoveQuotes(sUnInstallString);
    end;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-08
      • 1970-01-01
      • 1970-01-01
      • 2014-09-23
      相关资源
      最近更新 更多