首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >inno问题:无法执行从RegQueryStringValue检索到的文件

inno问题:无法执行从RegQueryStringValue检索到的文件
EN

Stack Overflow用户
提问于 2018-07-13 14:57:37
回答 2查看 758关注 0票数 1

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

错误消息:

代码语言:javascript
复制
Unable to execute file:
"c:\xxxx-runtime\unins000.exe"
CreateProcess failed; code 267.
The directory name is invalid.

Inno代码如下:

代码语言:javascript
复制
[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;

但是,如果我替换

代码语言:javascript
复制
[UninstallRun]
Filename: "{code:ARGetUninstallString}";

使用

代码语言:javascript
复制
[UninstallRun]
Filename: "c:\xxxx-runtime\unins000.exe";

有任何Inno专家知道这个问题是什么吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-24 21:14:35

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

代码语言:javascript
复制
[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;
票数 0
EN

Stack Overflow用户

发布于 2018-07-20 20:08:13

正如您已经发现的,{code:}常量是根据安装时间计算的。

因此,相反,完全在[Code]部分实现代码,而不是使用[UninstallRun]部分。

代码语言:javascript
复制
[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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51327935

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档