4

天哪,这太奇怪了,我不知道该说什么。简短的版本是我有一个模拟器应用程序,当用户要求我时,我会从我的应用程序中生成它。它最近停止工作,尽管我可以从命令行或开始菜单运行模拟器。这可能是由于迁移到 VS2010 或 Windows 7 或我没有注意到查看源代码控制差异的原因。

我有第二个模拟器,我尝试以相同的方式生成它,它工作正常。

默认情况下,我在 CreateProcess 周围使用 Qt3 的 QProcess 包装器,但我使用系统、我自己的 CreateProcess 和 ShellExecute 得到了相同的行为。

但是,cmd.exe "/c application params" 的 ShellExecute 确实为我提供了更多信息。我得到对话框

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

不方便的是,父应用程序和第二个模拟器都使用 MSVCR80.dll。

将 MSVC*80.dll 从 g:\windows\winsxs\x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.4927_none_d08a205e442db5b5 复制到与我的可执行文件相同的目录后,错误消息变为

“运行时错误!
程序:g:\path\to\app.exe
R6034
应用程序试图错误地加载 C 运行时库。
请联系应用程序的支持团队以获取更多信息。

其次是

应用程序无法正确启动 (0xc0000142)。单击确定关闭应用程序。

而且,再一次,应用程序在这些 dll 就位的命令行中运行良好。


更新:

我怀疑这可能与环境有关,所以将我的 ShellExecute 机制更改为 cmd /c set && app params。我用这些相同的参数设置了一个 cmd.exe,我的应用程序现在也同样崩溃了。当我弄清楚原因时会更新:)

这是 MATLAB 的组件运行时工具,它正在修改我的进程的 PATH 变量以产生不良影响。它在自己的目录中添加了 dll 并造成严重破坏。

4

3 回答 3

1

我正在使用的一个愚蠢的工具在 PATH 上做了一个 setenv,在它想要动态加载一些 dll 的目录之前添加了一个目录,但后来搞砸了我的应用程序。我最终使用了 GetEnvironmentStrings,如最后一个示例所示擦除 PATH env var 中的第一个条目,并将新的(原始)环境发送到包装 CreateProcessA 的 QProcess。

于 2010-11-04T14:14:29.947 回答
0

您需要安装CRT

于 2010-11-03T18:32:26.750 回答
0

可能会奏效 - 如果它坏了,你可以保留两部分:-)

尝试从此处安装 VC++ 可再发行组件 - http://www.microsoft.com/downloads/en/details.aspx?familyid=A5C84275-3B97-4AB7-A40D-3802B2AF5FC2&displaylang=en

记得在安装之前备份你的系统,创建一个还原点等。

另一个想法 - 尝试重新安装失败的应用程序本身。它可能带有自己的 VC++ 可再发行组件副本,重新安装可能会有所帮助。特别是。尝试使用 Windows 7 的兼容模式(可能回到 Vista 或 XP 兼容性)重新安装它可能会更有效。

重申一下 - 你必须尝试,而且我不知道上述任何一个想法是否会对你有好处,甚至肯定不会造成伤害。也就是说,如果我遇到类似的问题,这些是我会尝试的步骤。!

于 2010-11-03T18:38:33.927 回答