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

时间:2015-04-08 10:49:59

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

我有一个简单的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先决条件?

1 个答案:

答案 0 :(得分:0)

您必须确定出现了什么问题。通常,您描述的症状表示异常导致进程终止。这种例外的一个常见原因是滥用无效指针。

但是为什么它可以在一台计算机上运行而不是另一台计算机呢根据代码,它可能是随机的偶然事物。但只要这种情况每次重复,它就更有可能成为环境问题。这可能意味着缺少数据文件,缺少注册表项,缺少服务或缺少.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)可以为null;在第二个中,spSomeFace可能尚未成功创建实例。虽然代码可以(并且应该)防止这些场景崩溃,但修复崩溃不会让您的应用程序实际执行它应该执行的操作,并且您仍然必须解决该过程的原因, dll或实例无法按需要初始化。

您也可能错过了某个时候以不正确的方式使用的数据文件或注册表项。例如,代码可能假定数据文件存在,从它读取的数据构建指针,并且无法正常工作,因为文件不可用,因此它读入的缓冲区从未实际初始化。

简而言之,要解决此问题,如果它不是动态依赖关系扫描程序可以协助的依赖关系方案,则可能必须调试相关代码。您可以尝试像Process Monitor这样的工具,并在崩溃前不久查找涉及您的应用程序的错误。如果您有源代码和符号,您可以尝试在WinDbg下运行程序以确切地知道崩溃的原因,然后尝试找出它在一个环境中而不是另一个环境中执行此操作的原因。但是,根据您已提供的信息,没有人可以告诉您答案。