使用InstallShield(windows)部署的C++应用程序执行错误

Execution error with a C++ application deployed with InstallShield (windows)

本文关键字:C++ 应用程序 执行 错误 部署 InstallShield windows 使用      更新时间:2023-10-16

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

当我在另一台计算机上测试它时,设置似乎还可以,但当我尝试应用程序时,我出现了一个奇怪的错误:

MyProgramm.exe --help 

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

MyProgramm.exe -i InputDirectory -o OutputDirectory

失败,Windows显示以下消息:

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

我错过了什么?

我只构建了Release配置。如何确保我已检查了所有合并模块或InstallShield必备组件?

您必须确定出了什么问题。通常,您描述的症状表示异常导致进程终止。此类异常的一个常见来源是滥用无效指针。

但为什么它在一台电脑上工作,而在另一台电脑却不能?根据代码的不同,它可能是随机的偶发事件。但只要这种情况每次都重复,就更有可能是环境问题。这可能意味着缺少数据文件、注册表项、服务或.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下运行程序,弄清楚到底是什么崩溃了,然后试着弄清楚为什么它在一个环境中会崩溃,而在另一个环境下不会。但从你已经提供的信息来看,没有人能告诉你答案。