2011-05-04 36 views
3

我有一个C++应用程序,它加载了很多C++ DLL,并且很少选择C++ \ CLI。在其中一台机器上(Windows Server 2003 SP2)启动时,出现错误信息C++ CLI应用程序在加载时崩溃

应用程序无法正确初始化(0xC0000005)。单击确定以终止该应用程序。

当应用程序被使用WinDbg打开,而不是得到适当的DbgBbreak断点我得到这样的:

Microsoft (R) Windows Debugger Version 6.12.0002.633 X86 
Copyright (c) Microsoft Corporation. All rights reserved. 

CommandLine: d:\appdir\MyTrueApp.exe 
Symbol search path is: .sympath SRV*c:\localsymbols*http://msdl.microsoft.com/download/symbols 
Executable search path is: 
ModLoad: 00400000 0044b000 MyTrueApp.exe 
ModLoad: 7c800000 7c8c3000 ntdll.dll 
ModLoad: 77e40000 77f42000 C:\WINDOWS\system32\kernel32.dll 
ModLoad: 60200000 60264000 d:\AppDir\CustomCppDLL_ONE.dll 
ModLoad: 76aa0000 76acd000 C:\WINDOWS\system32\WINMM.dll 
ModLoad: 77380000 77411000 C:\WINDOWS\system32\USER32.dll 
ModLoad: 77c00000 77c49000 C:\WINDOWS\system32\GDI32.dll 
ModLoad: 7d1e0000 7d27c000 C:\WINDOWS\system32\ADVAPI32.dll 
ModLoad: 77c50000 77cf0000 C:\WINDOWS\system32\RPCRT4.dll 
ModLoad: 76f50000 76f63000 C:\WINDOWS\system32\Secur32.dll 
ModLoad: 10000000 10023000 d:\AppDir\CustomCppDLL_TWO.dll 
ModLoad: 7c420000 7c4a7000 C:\WINDOWS\WinSxS\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.5592_x-ww_179798C8\MSVCP80.dll 
ModLoad: 78130000 781cb000 C:\WINDOWS\WinSxS\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.5592_x-ww_179798C8\MSVCR80.dll 
ModLoad: 77ba0000 77bfa000 C:\WINDOWS\system32\msvcrt.dll 
ModLoad: 60300000 60332000 d:\AppDir\CustomCppDLL_3RD.DLL 
ModLoad: 781d0000 782df000 C:\WINDOWS\WinSxS\x86_Microsoft.VC80.MFC_1fc8b3b9a1e18e3b_8.0.50727.5592_x-ww_E87E0BCD\MFC80.DLL 
ModLoad: 7d180000 7d1d2000 C:\WINDOWS\system32\SHLWAPI.dll 
ModLoad: 77670000 777a9000 C:\WINDOWS\system32\ole32.dll 
ModLoad: 77d00000 77d8b000 C:\WINDOWS\system32\OLEAUT32.dll 
ModLoad: 00360000 00375000 d:\AppDir\CustomCppDLL_4th.DLL 
ModLoad: 60800000 6081a000 d:\AppDir\CustomCppDLL_5th.DLL 
ModLoad: 60600000 6074b000 d:\AppDir\CustomCppDLL_6th.DLL 
ModLoad: 003b0000 003c5000 d:\AppDir\CustomCppDLL_7th.DLL 
ModLoad: 77b90000 77b98000 C:\WINDOWS\system32\VERSION.dll 
ModLoad: 00450000 004d6000 d:\AppDir\CustomCppDLL_7th.DLL 
ModLoad: 7c8d0000 7d0cf000 C:\WINDOWS\system32\SHELL32.dll 
ModLoad: 61880000 618bb000 C:\WINDOWS\system32\OLEACC.dll 
ModLoad: 73070000 73097000 C:\WINDOWS\system32\WINSPOOL.DRV 
ModLoad: 762b0000 762f9000 C:\WINDOWS\system32\comdlg32.dll 
ModLoad: 77530000 775c7000 C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_5.82.3790.4770_x-ww_A689AB02\COMCTL32.dll 
ModLoad: 004e0000 00506000 d:\AppDir\CustomCppDLL_9th.DLL 
ModLoad: 00510000 00547000 d:\AppDir\CustomCppDLL_10th.DLL 
ModLoad: 71c00000 71c17000 C:\WINDOWS\system32\WS2_32.dll 
ModLoad: 71bf0000 71bf8000 C:\WINDOWS\system32\WS2HELP.dll 
ModLoad: 76cf0000 76d0a000 C:\WINDOWS\system32\iphlpapi.dll 
ModLoad: 76b70000 76b7b000 C:\WINDOWS\system32\PSAPI.DLL 
ModLoad: 6d580000 6d628000 C:\WINDOWS\system32\dbghelp.dll 
ModLoad: 00560000 0056a000 d:\AppDir\CustomCpp_CLI.DLL 
ModLoad: 79000000 7904a000 C:\WINDOWS\system32\mscoree.dll 
ModLoad: 71bc0000 71bc8000 C:\WINDOWS\system32\rdpsnd.dll 
ModLoad: 771f0000 77201000 C:\WINDOWS\system32\WINSTA.dll 
ModLoad: 71c40000 71c97000 C:\WINDOWS\system32\NETAPI32.dll 
*** ERROR: Symbol file could not be found. Defaulted to export symbols for ntdll.dll - 
(1510.1304): Access violation - code c0000005 (first chance) 
First chance exceptions are reported before any exception handling. 
This exception may be expected and handled. 

结果kc命令是

ntdll!LdrOpenImageFileOptionsKey 
ntdll!LdrQueryImageFileExecutionOptionsEx 
ntdll!LdrQueryImageFileExecutionOptions 
ntdll!RtlIpv4StringToAddressExW 
ntdll!RtlLogStackBackTrace 
ntdll!LdrGetProcedureAddress 
ntdll!EtwTraceMessage 
ntdll!RtlIsThreadWithinLoaderCallout 
ntdll!RtlGetActiveActivationContext 
ntdll!RtlGetActiveActivationContext 
ntdll!RtlGetActiveActivationContext 
ntdll!RtlGetActiveActivationContext 
ntdll!RtlGetActiveActivationContext 
ntdll!RtlGetActiveActivationContext 
ntdll!CsrClientConnectToServer 
ntdll!KiUserApcDispatcher 

Googlingntdll!LdrOpenImageFileOptionsKey表明,它是一个一部分的system loader。从这里没有更多的帮助,但似乎one poor guy有类似的问题,但没有解决方案。有once加载混合程序集的错误,但它是用于Visual Studio 2003,我在2005和.NET Framework 2.0。

在纯粹的绝望中,我尝试了.Net Framework repair,但当然没有运气。我回到Google,得到这个post有一个小线索。它指出

既然你收到错误消息 “未处理的非可持续 异常被处理 加载过程中引发的”,看来这个问题是通过对DLL文件 相关的一个困难问题引起 。有几个讨论 在这个题目,也许他们中的一些可以 帮助:

http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=325627&SiteID=1 
    http://groups.google.com/group/microsoft.public.vc.mfc/browse_thread/thread/560a31bb72b2bca8/44fb800374c2f3b0%2344fb800374c2f3b0 
    http://groups.google.com/group/microsoft.public.dotnet.languages.vc/browse_thread/thread/1243abff27e677ae/901c0a23deec7e47%23901c0a23deec7e47 

前两个环节是没有用的,但last一个提到类似的问题/DELAYLOAD连接选项帮助。通过将CustomCpp_CLI.DLL设置为可延迟加载,我得到了我的解决方案。我的应用rock'n'rolls now!

我仍然不知道为什么这有助于确切的原因。另一方面,我的C++ DLL在DllMain中做了一些奇怪的事情,因为Larry OstermanRaymond Chen写的是scary。也许我的DLL搞乱装载机?我不知道。

我写这为AAR (After Action Report)所以它在谷歌搜索结果弹出,将灵魂1天差在未来使互联网is a better place.

BTW如果有人知道为什么/DELAYLOAD帮助请赐教。

+0

你的C++ DLL的DllMain在做什么奇怪的事情? – 2012-05-23 12:39:36

回答

2

我遇到了一个类似的问题,在启动过程中C++/CLI应用程序崩溃,它也很模糊,它花了我一些调试和谷歌搜索发现罪魁祸首是WinMM DLL(Windows多媒体库)那是在它的入口点函数中做一些“不安全”的东西(名字叫“FreeLibrary”多次 - 我认为在文档中明确标记为不安全的东西)。 我找到了一些知识库文章,或者在微软网站上发布了关于此问题的解决方案,并且与您的情况一样 - 动态加载DLL(与/ DELAYLOAD开关效果相同),而不是静态链接到DLL。

在你的情况,我看到你也加载WinMM库。它是通过您的应用程序直接加载还是通过您的CustomCpp_CLI模块进行indireclty加载?知道你是否有同样的问题会很有趣,但无论如何,似乎一般的规则是静态链接到C++/CLI项目中的某些“行为不端”DLL是不安全的。

+0

有趣。我记得我在研究期间看到了一些WinMM参考资料,但我忽略了它们。 http://www.google.com/search?q=winmm+c%2B%2B%2Fcli+hangs提供了一些有趣的链接。 WinMM由CPP DLL之一加载。我从来没有,虽然我会遭受真正的Windows错误... – 2011-05-05 22:04:43

0

我看到你加载winsta.dll - MSDN论坛上的一个问题(和我正在开发的服务器应用程序中常见的问题)显示XP/2003上的终端服务导致C++/CLI混合模式DLL的加载错误(至少对于CLR2)在TS会话上。解决方法是使用VNC /类似的。

3

我遇到了这个完全相同的问题,并尝试了几个不同的策略,我最终不得不放弃由于我正在工作的代码库的问题。/ delayload策略不是我的选择。

但是我偶然发现了Microsoft Connect上的这个posting,它提供了一种解决方案,对我来说工作起来相当好。

基本上,在链接到任何非托管C++ dll的lib文件之前,非托管C++可执行文件需要链接到混合模式C++ dll的lib文件。

我指定此选项可以通过:

  1. 走进的属性对话框的可执行项目。
  2. 选择链接器 - >输入选项卡。
  3. 将混合模式库文件添加到Additional Dependencies字段的开头。

对我而言,这是最好的解决方案。它可以让我利用我的混合模式DLL而无需做大量工作或造成巨大的QA负担。

另一个可行的解决方案,但对我正在使用的代码库没有用处,是使非托管C++可执行文件成为混合模式可执行文件。

要做到这一点,而不使整个EXE一个CLR的exe ...

  1. 添加一个新的CPP文件到项目中。

  2. 右键单击该cpp文件。

  3. 选择属性。

  4. 选择常规选项卡

  5. 设置公共语言运行库支持标志/ CLR。

该cpp文件可以是空的,它不需要定义的类。只需要在那里制作可执行混合模式,以便正确链接所有内容。

希望这些解决方案之一能够帮助未来的人解决问题,因此他们不必花费大量时间来解决这个问题。

+0

哦,血腥地狱,谢谢!我一直在追寻这一段。 – Justin 2013-05-01 00:23:59

+0

我不明白为什么,但更改链接顺序是我的问题的解决方案!谢谢 – Stefano 2014-05-23 19:56:27

相关问题