inno 问题:无法执行从 RegQueryStringValue 检索的文件
inno issue: Unable to execute file retrieved from RegQueryStringValue
Execute/Run 下面的 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 专家知道问题出在哪里吗?
正如您自己发现的那样,{code:}
常量根据安装时间进行评估。
因此,请在 [Code]
部分完全实施您的代码,而不是使用 [UninstallRun]
部分。
[Code]
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usPostUninstall { or usUninstall } then
begin
{ Use RegQueryStringValue and Exec here }
end;
end;
尽管您需要修复解析卸载程序命令行的代码。请注意,在有关该主题的所有现有问题中,UninstallString
是如何拆分为程序路径和参数的。由于程序路径用双引号引起来,因此需要将其删除。
参见 。
下面是我的解决方案,基本上是在从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;
Execute/Run 下面的 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 专家知道问题出在哪里吗?
正如您自己发现的那样,{code:}
常量根据安装时间进行评估。
因此,请在 [Code]
部分完全实施您的代码,而不是使用 [UninstallRun]
部分。
[Code]
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usPostUninstall { or usUninstall } then
begin
{ Use RegQueryStringValue and Exec here }
end;
end;
尽管您需要修复解析卸载程序命令行的代码。请注意,在有关该主题的所有现有问题中,UninstallString
是如何拆分为程序路径和参数的。由于程序路径用双引号引起来,因此需要将其删除。
参见
下面是我的解决方案,基本上是在从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;