Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual c++ 加载动态链接到MFC的常规DLL时在appcore.cpp中的断言_Visual C++_Dll_Mfc - Fatal编程技术网

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

Visual c++ 加载动态链接到MFC的常规DLL时在appcore.cpp中的断言,visual-c++,dll,mfc,Visual C++,Dll,Mfc,我继承了一个应用程序,它由一个动态链接到MFC的常规DLL组成,并从一个也动态链接到MFC的Windows服务可执行文件加载。该代码正在使用Microsoft Visual Studio 2008 Professional(旧,我知道…)编译。此应用程序已“运行”多年,但我发现由于appcore.cpp中的以下断言,我无法将其作为调试版本运行: 调试断言失败! 程序:C:\Projects\CMM\Debug\CMM.exe 文件:f:\dd\vctools\vc7libs\ship\atlmf

我继承了一个应用程序,它由一个动态链接到MFC的常规DLL组成,并从一个也动态链接到MFC的Windows服务可执行文件加载。该代码正在使用Microsoft Visual Studio 2008 Professional(旧,我知道…)编译。此应用程序已“运行”多年,但我发现由于appcore.cpp中的以下断言,我无法将其作为调试版本运行:

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

有关程序如何导致断言的更多信息 失败,见Actudio.VisualC++文档。 (按“重试”调试应用程序)

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

ASSERT(AfxGetThread() == NULL);
pThreadState->m_pCurrentWinThread = this;
ASSERT(AfxGetThread() == this);
当通过
LoadLibrary
加载DLL时会发生这种情况,这让我怀疑多年来应用程序的运行更多的是靠运气,而不是判断(因为
ASSERT
未作为发布版本的一部分包含在内)

我对MFC的理解(承认是有限的)是,尽管通常只有一个
CWinApp
实例,但允许在动态链接到MFC的常规DLL中有一个附加实例,如本例所示。该代码在服务可执行文件中有一个实例,在DLL中有一个实例。调用
CWinApp
构造函数三次,一次用于MFC框架内的某个内部实例,一次用于服务可执行文件中的实例,一次用于DLL中的实例。前两个很好,第三个爆炸了

所有导出的函数都是从
AFX\u MANAGE\u STATE
开始的(尽管执行从未如此),我相信预处理器标志是正确的w.r.t.Microsoft文档(
\u afxdl
用于EXE,
\u afxdl
\u USRDLL
\u windell
用于DLL)

我尝试使用
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    
mfc90d.dll!CWinApp::CWinApp(conchch*LPSZAPNAME= 0x90000)行380 +0x1C字节C++
cimdll.dll!CCimDllApp:CIMDLLAPP()行146 +0x19字节C++
cimdll.dll`“TeApp”()129行+0xD字节C++的动态初始化器
msvcr90d.dll_初始项(无效)**pfbegin=0x1b887c88,无效)**pfend=0x1b887d6c)第903行C
cimdll.dll_CRT_INIT(void*hDllHandle=0x1b770000,无符号长dwReason=1,void*lpreserved=0x00000000)行318+0xf字节C
cimdll.dll__DllMainCRTStartup(void*hDllHandle=0x1b770000,无符号长dwReason=1,void*lpreserved=0x00000000)行540+0x11字节C
cimdll.dll_DllMainCRTStartup(void*hDllHandle=0x1b770000,无符号长dwReason=1,void*lpreserved=0x00000000)行510+0x11字节C
ntdll.dll_LdrxCallInitRoutine@16()+0x16字节
ntdll.dll!LdrpCallInitRoutine()+0x43字节
ntdll.dll!LdrpInitializeNode()+0x101字节
ntdll.dll!LdrpInitializeGraphRecurse()+0x71字节
ntdll.dll!LdrpPrepareModuleForExecution()+0x8b字节
ntdll.dll!LdrpLoadDllInternal()+0x121字节
ntdll.dll!LdrpLoadDll()+0x92字节
ntdll.dll_LdrLoadDll@16()+0xd9字节
KernelBase.dll_LoadLibraryExW@12()+0x138字节
KernelBase.dll_LoadLibraryExA@12()+0x26字节
KernelBase.dll_LoadLibraryA@4()+0x32字节
mfc90d.dll!AfxCtxLoadLibraryA(conchch*LPLBILFENAME= 0x02A70CE0)行487 +0x74字节C++
mfc90d.dll!AfxLoadLibrary(conchch*LPSZMuleMeNAME= 0x02A70CE0)行193 +0x9字节C++
CMM.exe!CMonDevDll::LADDLE()行207 +0x1b字节C++
CMM.exe!CMonDevDll::LoDoul(268)+0x8字节C++
CMM.exe!CMonDevDll:初始化(cMunDeValdPvunDeVald= 0x019FE60)行186 +0x8字节C++
CMM.exe!CCtcLinkMonDev::初始化(cMunDeValp*PunMeDunRun= 0x019FE60,CTCCRISGRIGITY&RG= {…},int nLINKID=1)行546 +0x18字节C++
CMM.exe!CCtcLinkSwitchMgr:初始化(CMONDEVRUN*PMONDEVRun= 0x019FE60,CTCCRICGISIGRES&RG={…})行188 +0x14字节C++
CMM.exe!CMonDevRun::初始化(ATL:CSTRANT SZService Ne= = CIMService)257行+0x16字节C++
CMM.exe!CMonDevService::()(202)+0x2D字节C++
CommonFilesD.dll!CCtcServiceBase::ParseStandardArgs(int ARCC=1,CHAR**ARGV= 0x02A51 B44)行278 +0xF字节C++
CMM.exe!主(int ARCC=4,CHAR**ARGV= 0x02A51 B38)行126 +0x16字节C++
CMM.exe__tmainCRTStartup()行586+0x19字节C
CMM.exe!mainCRTStartup()行403 C
内核32.dll@BaseThreadInitThunk@12()+0x24字节
ntdll.dll__RtlUserThreadStart()+0x2f字节
ntdll.dll__RtlUserThreadStart@8()+0x1b字节

我终于找到了撞车的原因。我的DLL使用的库正在静态链接到Boost.Thread并导致此问题,可能是由于运行时不匹配。将库更改为动态链接以增强,似乎解决了这个问题。

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

你能告诉我App是类或外部的成员吗。@SantoshDhanawade,
theApp
被声明为全局变量,它不是类成员,也没有外部引用。Hi@SantoshDhana