【问题标题】:Inno Setup: Exec can't read string?Inno Setup:Exec 无法读取字符串?
【发布时间】:2013-10-06 20:06:37
【问题描述】:

我正在尝试组合一个简单的 Inno Setup 安装程序,它会查找以前的版本并在继续之前将其删除。一切正常,直到我得到以下代码:

  if Exec(UninstallString, '/SILENT', '', SW_SHOW, ewWaitUntilTerminated, ResultCode) then
  begin
    MsgBox('Previous version found and uninstalled successfully.', mbInformation, MB_OK);
  end
  else
  begin
    MsgBox('Please uninstall the previous version of this mod before continuing.', mbInformation, MB_OK);
    Result := FALSE;
  end;

这是一段非常简单的代码,但总是失败。我检查了 UninstallString 的内容,它们是正确的 (C:\Windows\unins000.exe) 但 Exec 失败并出现错误:“目录名称无效。”

它似乎无法正确读取“UninstallString”的内容,因为如果我手动输入它们(例如Exec('C:\Windows\unins000.exe, ...),它可以正常工作。

如何让Exec 按预期处理字符串“UninstallString”?

【问题讨论】:

  • 谢谢,你是对的。我收到以下错误:“目录名称无效。”
  • 是的,我肯定在查找以前的 AppId。其次,正如问题中所述,我检查了字符串的内容,它们符合预期:-/
  • 那是不可能的。字符串常量和与常量具有相同值的string 类型变量之间通常没有区别。问题一定出在其他地方。不要使用AnsiString 类型,例如对于UninstallString 变量,不是吗?
  • 我用:UninstallString: string; 有错吗?而且,我向你保证,内容就在那里。我刚刚又检查了一遍。这让我难以置信。
  • 不,这是正确的。然后(从Exec 函数的角度来看)该常量与具有与常量相同值的变量之间绝对没有区别。我开始考虑该注册表值中的一些不可打印字符...您如何检查 UninstallString 值?

标签: installation inno-setup pascal


【解决方案1】:

我不知道您是否已经使用MsgBox 来确定@​​987654322@ 在注册表中的精确 字符串,但在注册表中,正常字符串是"C:\Windows\unins000.exe"

注意命令周围的额外 "

在命令周围使用Exec" 时,您会得到一个ResultCode 267,这是一个invalid directory 错误。所以你需要在Exec之前去掉它们。

当您在Exec 中手动输入C:\Windows\unins000.exe 时,您很方便地忘记了它们;)

【讨论】:

  • MsgBox 打印字符串值的方法不是最好的方法,因为您会丢失不可打印的字符。对于这种情况,这些可能是严重的问题(但似乎不是)。
  • 是的,但" 是一个可打印的字符,我认为该命令是围绕" 进行的(Exec 无法处理)。
  • 不,我的意思是我们正在谈论的文件名可能包含不可打印的字符,例如#8、#9 等等。而那些你不会看透MsgBox 的人可能是Exec 的问题。 MsgBox 不是查看真实字符串值的正确方法。哇! :-)
  • @Rik 发现这个做得好!我按照 TLama 的建议将值输出到 Log,它确实是“C:\Windows\unins000.exe”!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多