【问题标题】:Execution error with a C++ application deployed with InstallShield (windows)使用 InstallShield (windows) 部署的 C++ 应用程序的执行错误
【发布时间】:2015-04-08 10:49:58
【问题描述】:

我有一个在 Visual Studio Community 2013 下开发的简单 C++ 程序(带有 Boost 库的命令行)。我想将它部署在其他 Windows 计算机上,因此我正在 Visual 中测试 InstallShield LE(我是新手与 InstallShield)。我在当前解决方案中添加了一个 InstallShield 项目,并设法创建了一个 setup.exe。

当我在另一台计算机上测试它时,设置似乎正常,但是当我尝试应用程序时,我遇到了奇怪的错误:

MyProgramm.exe --help 

发送正确的结果(但不是很有趣)。

MyProgramm.exe -i InputDirectory -o OutputDirectory

失败,Windows 显示此消息:

一个问题导致程序停止正常工作。如果有可用的解决方案,Windows 将关闭该程序并通知您。

我错过了什么?

我只构建了发布配置。如何确定我已检查所有合并模块或 InstallShield 先决条件?

【问题讨论】:

  • 这与 InstallShield 有什么关系?也许您的程序存在您从未意识到的错误。
  • 不行,程序在有visual的电脑上运行正常。
  • 在这种情况下,我首先要检查的是您是否链接到调试 crt dll。这些是不可再分发的,我认为链接到它们会使这个错误出现在没有安装 VS 的不同机器上。否则,您的程序逻辑可能无法解释文件系统中的差异。
  • 我只构建了发布配置。如何确定我已检查所有合并模块或 InstallShield 先决条件?
  • @Melanie 如果它是你的程序,你应该知道它需要什么才能在另一台没有Installshield的机器上正确运行。您应该知道需要哪些第三方 DLL。了解这一点的一种方法是将应用程序的可执行文件拖到“Dependency Walker”之类的程序中,然后查看所需的 DLL 是什么。

标签: c++ visual-studio-2012 deployment installshield


【解决方案1】:

您必须找出问题所在。通常,您描述的症状表明异常导致进程终止。此类异常的一个常见来源是滥用无效指针。

但是为什么它可以在一台计算机上运行而不是在另一台计算机上运行呢?根据代码,它可能是随机的偶然事物。但只要这种情况每次都重复,它更有可能是环境问题。这可能意味着缺少数据文件、缺少注册表项、缺少服务或缺少 .dll 依赖项。

因为您可以至少以一种方式运行程序,所以您知道它不是静态依赖项。如果是这样,您将收到有关无法加载某些文件或其依赖项之一的消息。但是在某些执行路径中,您会看到崩溃。因此,如果它是一个依赖项,它就是 InstallShield 所说的动态依赖项。我个人不是它的忠实粉丝(我更愿意被告知确切可能需要什么),但是有一个动态依赖扫描向导可以帮助识别这些文件并将它们包含到项目中。

这只有在问题源于以下原因时才会有所帮助:

HMODULE hMod = ::LoadLibrary(TEXT("SomeFunky.dll"));
SOMEPROC proc = (SOMEPROC)::GetProcAddress(hMod, "SomeFunkyProc");
int result = proc(some, args);

或者可能来自与 COM 相关的变体,看起来像这样:

CComPtr<ISomeFace> spSomeFace;
HRESULT hr = spSomeFace.CoCreateInstance(CLSID_SomeFace);
hr = spSomeFace->SomeMethod(some, args);

这里的常见问题是这些代码块都不能验证它调用的函数是否可以安全调用。在第一种情况下,proc(甚至hMod)可以为空;其次,spSomeFace 可能没有成功创建实例。虽然代码可以(并且应该)防止这些情况崩溃,但修复崩溃不会让您的应用程序实际执行它应该做的事情,您仍然必须修复过程、dll 或实例无法执行的原因根据需要进行初始化。

您还可能丢失了某个数据文件或注册表项,而这些数据文件或注册表项在某些时候以不正确的方式使用。例如,代码可能假设一个数据文件存在,从它读取的数据构建一个指针,但由于文件不可用而无法正常工作,因此它读入的缓冲区从未真正初始化。

所以简而言之,为了解决这个问题,如果动态依赖扫描器无法协助解决依赖场景,您可能必须调试有问题的代码。您可以尝试使用 Process Monitor 之类的工具,并在崩溃前不久查找涉及您的应用程序的错误。如果您有源代码和符号,您可以尝试在 WinDbg 下运行该程序以准确找出崩溃的原因,然后尝试找出为什么它在一种环境中而不是另一种环境中发生这种情况。但仅从你已经提供的信息来看,没有人能告诉你答案。

【讨论】:

  • 非常感谢大家的时间和回答/cmets:这与 InstallShield 无关(它“只是”另一台计算机上的数据问题和未捕获的异常......)我太专注于 InstallShield!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多