【问题标题】:while debugging with Environment Variable "The program can't start because ....dll is missing"使用环境变量调试时“程序无法启动,因为 ....dll 丢失”
【发布时间】:2012-09-12 15:00:12
【问题描述】:

在这些情况下,在 Delphi XE2 更新 4 中调试可执行文件时,我得到了进一步提到的错误:

  • 取决于来自 WebShpere 的 C:\Program Files \IBM\WebSphere MQ\bin\mqic.dll 中的 mqic.dllC:\Program Files\IBM\WebSphere MQ\bin 在系统路径上(而不是在用户路径上)。
  • 正在使用Run -> Parameters -> Debugger -> Environment Block -> User overrides 中的覆盖环境变量进行调试
  • 同一属性页上的Including System Variables 已选中

这是错误(这是标记为“系统错误”的 Windows DLL 加载错误)。

程序无法启动,因为您的计算机缺少 mqic.dll。尝试重新安装程序以解决此问题。

几点说明:

  • 我以普通用户的身份进行调试(无论如何这都是正常的做法,但在这种情况下,由于客户端的政策,我不能成为管理员)。
  • 只要我删除环境变量,它就可以工作(但程序会出错,因为它确实需要信息)。
  • 在 Delphi 启动之前指定环境变量很麻烦,但作为一种临时解决方法是可行的(我需要在调试时经常更改该变量以测试不同的场景;Delphi 的启动/关闭时间使这变得乏味)。
  • 我不能没有环境变量,因为它是应用程序所必需的,因为它没有源代码并且无法及时重写以使其被淘汰

这是事件日志显示的内容:

Faulting application name: CAS400NTMQ.exe, version: 1.1.4639.52512, time stamp: 0x50508180
Faulting module name: ntdll.dll, version: 6.1.7601.17725, time stamp: 0x4ec49b60
Exception code: 0xc0000005
Fault offset: 0x0005333f
Faulting process id: 0x4b20
Faulting application start time: 0x01cd90e36bb90816
Faulting application path: C:\Users\...\bin\CAS400NTMQ.exe
Faulting module path: C:\Windows\SYSTEM32\ntdll.dll
Report Id: a9853965-fcd6-11e1-ae66-78e3b5ca2514

问题:有没有比我上面使用的其他解决方案或更简单的解决方法?

【问题讨论】:

  • 好吧,不知道为什么会发生这种情况,但简单的解决方法是编写一个批处理文件(.bat)来设置环境变量(使用 set)然后启动 Delphi。这就是您所说的繁琐,但批处理文件可以解决这个问题。或者使用 Windows 环境变量设置对话框在 IDE 之外创建用户环境变量。那么你就不需要管理员权限了。
  • 顺便说一句,您声明您无法以管理员身份进行调试。听起来好像这样做是正常的做法。真的不是!
  • 你是对的,它不是(我会强调这一点)。在这种情况下,即使需要,我也无法做到。
  • 奇怪,GetEnvironmentVariable('PATH') 在调试时返回空字符串,否则正确路径。在“系统变量”中选择“PATH”,然后单击“添加覆盖”。值得一试..
  • 只有在有覆盖的情况下才能观察到上一条评论中的行为,而不是在“用户覆盖”部分为空的情况下。 XE及以下似乎没有类似的问题。

标签: delphi debugging dll delphi-xe2


【解决方案1】:

根据Andreas Hausladen's latest blog posthis answer here,这个XE2 错误由IDEFixPack 处理。并且在 XE3 中不需要,因为 XE3 解决了这个问题。

所以我怀疑如果您能设法在这台机器上安装IDEFixPack,这可能是最有效的解决方法。即使您无法安装 IDEFixPack,那么这个答案仍然对其他读者有用。

【讨论】:

  • +1;我已经在我的本地开发工作站上完成了这项工作,效果很好。将尝试查看是否可以安装 IDEFixPack,这可能是可行的,因为它没有在我的本地开发工作站上要求 UAC。
【解决方案2】:

Delphi XE2 对用户覆盖的环境变量的处理存在问题。获取示例应用程序:

program Project1;

{$APPTYPE CONSOLE}

uses
  System.SysUtils;

begin
  Writeln(GetEnvironmentVariable('PATH'));
  Readln;
end.

当调试器用完或没有用户覆盖环境变量时,这将输出路径正常。但是只要在 Run->Parameters->Environment Block 中引入环境变量,就会输出一个空字符串。

一种可能的解决方法似乎是覆盖所需的变量,在本例中为“PATH”。然后程序可以再次输出(并可能使用)正确的路径。显然,这是一个相当有限的解决方法。一旦你使用了用户覆盖,你失去的不仅仅是“PATH”。菲示例程序仍然无法输出“APPDATA”。

以前的 Delphi 版本似乎没有这个问题。有一份关于 QC 的报告:Include System Variables isn't working anymore 在版本 17.0.4625.53395 中作为“固定”关闭。

【讨论】:

  • +1。仅供参考:修复的内部版本号是 XE3 的初始发行版本和内部版本号。还可以确认您的代码在 XE3 中测试时为 PATH 生成正确的输出。
  • 作为上述评论的注释:在 Project->Options->Environment Block 中确认有无用户覆盖 PATH。 (在我可以添加之前编辑超时。)
  • @Ken:我可以确认 XE2 中的错误和 XE3 中的修复。内部版本 17.0.4625 是 XE3。
猜你喜欢
  • 2013-01-29
  • 2014-04-10
  • 2018-09-01
  • 2012-06-27
  • 2013-03-15
  • 1970-01-01
  • 2011-08-01
  • 2012-01-03
  • 1970-01-01
相关资源
最近更新 更多