首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在加载动态链接到MFC的常规DLL时,appcore.cpp中的断言

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

Stack Overflow用户
提问于 2016-10-04 15:16:38
回答 1查看 1.7K关注 0票数 1

我继承了一个应用程序,该应用程序由一个动态链接到MFC的常规DLL组成,该DLL是从Windows服务可执行文件加载的,该可执行文件还动态地链接到MFC。该代码正在使用MicrosoftVisualStudio2008Professional(我知道.)编译。这个应用程序已经“工作”几年了,但由于appcore.cpp中的以下断言,我发现不能以Debug构建的形式运行它:

调试断言失败!程序: f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\appcore.cpp文件: C:\Projects\CMM\Debug\CMM.exe行: 380 有关程序如何导致断言失败的详细信息,请参阅“断言”上的VisualC++文档。 (按“重试”以调试应用程序)

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

代码语言:javascript
运行
复制
ASSERT(AfxGetThread() == NULL);
pThreadState->m_pCurrentWinThread = this;
ASSERT(AfxGetThread() == this);

这发生在通过LoadLibrary加载DLL时,并使我怀疑应用程序多年来的运气比判断更好地工作(因为ASSERT没有作为发行版构建的一部分包括在内)。

我对MFC的理解(诚然是有限的)是,虽然通常只应该有一个CWinApp实例,但是在动态链接到MFC的常规DLL中允许有一个额外的实例,就像在本例中一样。代码在服务可执行文件中有一个实例,在DLL中有一个实例。CWinApp构造函数被调用为三(?)次数,一次用于MFC框架内的某些内部实例,一次用于服务可执行文件中的实例,一次用于DLL中的实例。前两个工作得很好,第三个爆炸了。

所有导出的函数都是从AFX_MANAGE_STATE开始的(尽管执行从来没有这么远),我相信预处理器标志是正确的w.r.t。微软的文档( EXE的_AFXDLL_AFXDLL_USRDLL和DLL的_WINDLL )。

我尝试过使用AfxLoadLibrary而不是LoadLibrary,但没有效果。但是,如果我包括

代码语言:javascript
运行
复制
AFX_MANAGE_STATE( AfxGetStaticModuleState() )

在调用LoadLibrary/AfxLoadLibrary的函数开始时,CWinApp对象实际上是构造的,但执行却以dllmodul.cpp代替。

有人能解释一下为什么会发生这种情况,或者我需要做些什么来解决这个问题吗?

编辑

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

代码语言:javascript
运行
复制
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    
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-07 09:45:41

我终于找到了坠机的原因。我的DLL使用的库静态地链接到Boost.Thread并导致此问题,这可能是由于运行时不匹配造成的。将库动态链接改为Boost似乎解决了这个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39856015

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档