从注册表和 运行 中读取卸载程序的路径(如果存在)
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;
问题(已编辑) 在 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;