从注册表和 运行 中读取卸载程序的路径(如果存在)

Read path of uninstaller from Registry and run, if existent

问题(已编辑) 在 InnoSetup 脚本中,我必须卸载我程序的 另一个安装 ,该程序之前已由 InnoSetup 安装, 也。尽管在这种特殊情况下它是同一个程序,但它的安装方式已经改变(它是一个独立的安装,现在它成为另一个程序的一部分),所以 InnoSetup 通常的更新程序无法处理这种情况。

我可以使用 {reg:...} 表达式从 Windows 注册表中读取它的“UninstallString”,如下所示。

尽管注册表条目存在,InnoSetup 告诉我“无法执行文件,CreateProcess 失败,代码为 87”。

根据错误信息,从Registry读取的路径是正确的;如果我在命令 window 中完全执行此路径,则卸载工作正常。

[Run]
Filename="{reg:HKLM\SOFTWARE\WOW6432\Microsoft\Windows\CurrentVersion\Uninstall\MyProg_is1,UninstallString}"; Parameters: "/silent"; Flags: skipifdoesntexist

此外,如果我将该路径作为“Filename=”直接放入 [运行] 部分,它会起作用。

知道我做错了什么吗?

这是我针对给定情况的解决方案。 PrepareToInstall 是一个 call-back 函数,如果存在,它会在安装前由 Pascal 脚本引擎自动调用。

[Code]

(**
* Uninstall previous stand-alone installation of a program, if present
**)
Function PrepareToInstall(var NeedsRestart: Boolean): String;
var
  UninstallString: String;
  ResultCode: Integer;
  pgmname : String;

begin
  pgmname := 'PrevProgramName';
  Result := '';
  if RegQueryStringValue(
          HKLM32, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + pgmname + '_is1',
          'UninstallString', UninstallString) then

      // Strip quotation marks from the path
      StringChangeEx(UninstallString, '"', '', True);

      if UninstallString <> '' then
        if Exec(UninstallString, '/verysilent', '', 1, ewWaitUntilTerminated, ResultCode) then
          Result := ''
        else
          Result := 'Error executing uninstaller, Code ' + IntToStr(ResultCode);

end;