appcore.cpp中的断言,同时加载动态链接到MFC的常规DLL

时间:2016-10-04 15:16:38

标签: visual-c++ dll mfc

我继承了一个应用程序,它由一个动态链接到MFC的常规DLL组成,并且从一个Windows服务可执行文件加载,该服务器也动态链接到MFC。代码正在使用Microsoft Visual Studio 2008 Professional编译(旧的,我知道......)。这个应用程序一直在工作'几年但我发现由于appcore.cpp中的以下断言,我无法将其作为Debug构建运行:

  

调试断言失败!   程序:C:\ Projects \ CMM \ Debug \ CMM.exe   文件:f:\ dd \ vctools \ vc7libs \ ship \ atlmfc \ src \ mfc \ appcore.cpp   行:380

     

有关程序如何导致断言的更多信息   失败,请参阅关于断言的Visual C ++文档。

     

(按“重试”调试应用程序)

对应于CWinApp构造函数中的以下代码:

ASSERT(AfxGetThread() == NULL);
pThreadState->m_pCurrentWinThread = this;
ASSERT(AfxGetThread() == this);

当通过LoadLibrary加载DLL时会发生这种情况,并导致我怀疑该应用程序运气多于多年的判断(由于ASSERT未包含在发布版本中)。

我对MFC的理解是,虽然通常只应该有CWinApp的单个实例,但允许在常规DLL中另外添加一个动态链接到MFC的实例,如本例所示。代码在服务可执行文件中有一个实例,在DLL中有一个实例。 CWinApp构造函数被调用三次(?)次,一次用于MFC框架内的一些内部实例,一次用于服务可执行文件中的实例,一次用于DLL中的实例。前两个工作正常,是第三个爆炸。

所有导出的函数都以AFX_MANAGE_STATE开头(虽然执行永远不会那么远),而且我相信预处理器标志正确w.r.t. Microsoft的文档(EXE为_AFXDLL,DLL为_AFXDLL_USRDLL_WINDLL

我尝试使用AfxLoadLibrary代替LoadLibrary无效。但是,如果我包括

AFX_MANAGE_STATE( AfxGetStaticModuleState() )

在调用LoadLibrary / AfxLoadLibrary的函数的开头,实际构造了CWinApp对象 但是执行然后在dllmodul.cpp中爆炸

任何人都可以阐明为什么会发生这种情况或我需要做些什么来解决这个问题?

修改

这是断言发生时的调用堆栈:

mfc90d.dll!CWinApp::CWinApp(const char * lpszAppName=0x00000000)  Line 380 + 0x1c bytes C++
cimdll.dll!CCimDllApp::CCimDllApp()  Line 146 + 0x19 bytes  C++
cimdll.dll!`dynamic initializer for 'theApp''()  Line 129 + 0xd bytes   C++
msvcr90d.dll!_initterm(void (void)* * pfbegin=0x1b887c88, void (void)* * pfend=0x1b887d6c)  Line 903    C
cimdll.dll!_CRT_INIT(void * hDllHandle=0x1b770000, unsigned long dwReason=1, void * lpreserved=0x00000000)  Line 318 + 0xf bytes    C
cimdll.dll!__DllMainCRTStartup(void * hDllHandle=0x1b770000, unsigned long dwReason=1, void * lpreserved=0x00000000)  Line 540 + 0x11 bytes C
cimdll.dll!_DllMainCRTStartup(void * hDllHandle=0x1b770000, unsigned long dwReason=1, void * lpreserved=0x00000000)  Line 510 + 0x11 bytes  C
ntdll.dll!_LdrxCallInitRoutine@16()  + 0x16 bytes   
ntdll.dll!LdrpCallInitRoutine()  + 0x43 bytes   
ntdll.dll!LdrpInitializeNode()  + 0x101 bytes   
ntdll.dll!LdrpInitializeGraphRecurse()  + 0x71 bytes    
ntdll.dll!LdrpPrepareModuleForExecution()  + 0x8b bytes 
ntdll.dll!LdrpLoadDllInternal()  + 0x121 bytes  
ntdll.dll!LdrpLoadDll()  + 0x92 bytes   
ntdll.dll!_LdrLoadDll@16()  + 0xd9 bytes    
KernelBase.dll!_LoadLibraryExW@12()  + 0x138 bytes  
KernelBase.dll!_LoadLibraryExA@12()  + 0x26 bytes   
KernelBase.dll!_LoadLibraryA@4()  + 0x32 bytes  
mfc90d.dll!AfxCtxLoadLibraryA(const char * lpLibFileName=0x02a70ce0)  Line 487 + 0x74 bytes C++
mfc90d.dll!AfxLoadLibrary(const char * lpszModuleName=0x02a70ce0)  Line 193 + 0x9 bytes C++
CMM.exe!CMonDevDll::LoadDLL()  Line 207 + 0x1b bytes    C++
CMM.exe!CMonDevDll::LoadDllEntryPoints()  Line 268 + 0x8 bytes  C++
CMM.exe!CMonDevDll::Initialize(CMonDevRun * pMonDevRun=0x0019fe60)  Line 186 + 0x8 bytes    C++
CMM.exe!CCtcLinkMonDev::Initialize(CMonDevRun * pMonDevRun=0x0019fe60, CCtcRegistry & reg={...}, int nLinkId=1)  Line 546 + 0x18 bytes  C++
CMM.exe!CCtcLinkSwitchMgr::Initialize(CMonDevRun * pMonDevRun=0x0019fe60, CCtcRegistry & reg={...})  Line 188 + 0x14 bytes  C++
CMM.exe!CMonDevRun::Initialize(ATL::CStringT<char,StrTraitMFC_DLL<char,ATL::ChTraitsCRT<char> > > szServiceName="CimService")  Line 257 + 0x16 bytes    C++
CMM.exe!CMonDevService::Run()  Line 202 + 0x2d bytes    C++
CommonFilesD.dll!CCtcServiceBase::ParseStandardArgs(int argc=-1, char * * argv=0x02a51b44)  Line 278 + 0xf bytes    C++
CMM.exe!main(int argc=4, char * * argv=0x02a51b38)  Line 126 + 0x16 bytes   C++
CMM.exe!__tmainCRTStartup()  Line 586 + 0x19 bytes  C
CMM.exe!mainCRTStartup()  Line 403  C
kernel32.dll!@BaseThreadInitThunk@12()  + 0x24 bytes    
ntdll.dll!__RtlUserThreadStart()  + 0x2f bytes  
ntdll.dll!__RtlUserThreadStart@8()  + 0x1b bytes    

1 个答案:

答案 0 :(得分:0)

我终于找到了崩溃的原因。我的DLL使用的库静态链接到Boost.Thread并导致此问题,可能是由于运行时不匹配。改变库以动态链接到Boost似乎已经解决了这个问题。