代码之家  ›  专栏  ›  技术社区  ›  Thomas daign

问题生成应用程序

  •  4
  • Thomas daign  · 技术社区  · 14 年前

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

    我有第二个模拟器,我试着用同样的方式生成,它工作得很好。

    默认情况下,为此,我使用qt3的qprocess包装器来绕过createprocess,但使用system、我自己的createprocess和shellexecute时会得到相同的行为。

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

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

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

    将msvc*80.dll从g:\windows\winxs\x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.4927_none_d08a205e442db5b5b5复制到与我的可执行文件相同的目录时,错误消息更改为

    “运行时错误!
    程序:g:\path\to\app.exe
    R6034
    应用程序试图错误地加载C运行时库。
    有关详细信息,请与应用程序的支持团队联系。

    然后

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

    而且,应用程序在命令行中运行良好,并且这些DLL都已就位。


    更新:

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

    正是Matlab的组件运行时工具修改了我的进程的路径变量,导致了不良的效果。它正在准备自己的目录,其中充满了动态链接库,并造成了巨大的破坏。

    3 回复  |  直到 14 年前
        1
  •  1
  •   Thomas daign    14 年前

    我使用的一个愚蠢的工具在path上做了一个setenv,为动态加载一些dll准备了一个目录,但后来它把我的应用程序搞砸了。我最终使用了getenvironmentstrings,如上一个示例所示 here ,删除路径env var中的第一个条目,并将新(原始)环境发送到qprocess,qprocess包装了createprocessa。

        2
  •  0
  •   ruslik    14 年前

    您需要安装 CRT

        3
  •  0
  •   Vatsan    14 年前

    这个 可以 工作-如果它坏了,你可以保留这两个部分:—)

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

    在安装东西之前,请记住备份系统、创建还原点等。

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

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