描述:
我创建了一个文档试图分离插件,程序运行开始加载的时候,正确加载,且运行正常,以下是我加载DLL的程序,
CMultiDocTemplate* CConnerAssistantApp::AddDocViewByCLSID(CLSID clsid)
{
CComPtr<IDocView> pDocView;
HRESULT hr = NOERROR;
long nDocCls = 0;
long nViewCls = 0;
long nChldFrm = 0;
CMultiDocTemplate* pDocTemplate = NULL;
CString str;
hr = pDocView.CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER);
if(SUCCEEDED(hr))
{
pDocView->GetDocCls(&nDocCls);
pDocView->GetViewCls(&nViewCls);
pDocView->GetChldFrm(&nChldFrm);
pDocTemplate = new CMultiDocTemplate(
IDR_MAINFRAME,
(CRuntimeClass*)nDocCls,
(CRuntimeClass*)nChldFrm,
(CRuntimeClass*)nViewCls);
AddDocTemplate(pDocTemplate);
}
else
{
AfxMessageBox(_T("not support this file!"));
}
pDocView = NULL;
return pDocTemplate;
};
接下来,请看output:
'ConnerAssistant.exe': Loaded 'D:\workfiles\test tool project\vs2005\projects\ConnerAssistant\debug\ConnerAssistant.exe', Symbols loaded.
'ConnerAssistant.exe': Loaded 'C:\WINDOWS\system32\ntdll.dll', No symbols loaded.
'ConnerAssistant.exe': Loaded 'C:\WINDOWS\system32\kernel32.dll', No symbols loaded.
'ConnerAssistant.exe': Loaded 'C:\WINDOWS\WinSxS\x86_Microsoft.VC80.DebugMFC_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_257740a4\mfc80ud.dll', Symbols loaded.
'ConnerAssistant.exe': Loaded 'C:\WINDOWS\WinSxS\x86_Microsoft.VC80.DebugCRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_5490cd9f\msvcr80d.dll', Symbols loaded.
'ConnerAssistant.exe': Loaded 'C:\WINDOWS\system32\msvcrt.dll', No symbols loaded.
'ConnerAssistant.exe': Loaded 'C:\WINDOWS\system32\gdi32.dll', No symbols loaded.
'ConnerAssistant.exe': Loaded 'C:\WINDOWS\system32\user32.dll', No symbols loaded.
'ConnerAssistant.exe': Loaded 'C:\WINDOWS\system32\shlwapi.dll', No symbols loaded.
'ConnerAssistant.exe': Loaded 'C:\WINDOWS\system32\advapi32.dll', No symbols loaded.
'ConnerAssistant.exe': Loaded 'C:\WINDOWS\system32\rpcrt4.dll', No symbols loaded.
'ConnerAssistant.exe': Loaded 'C:\WINDOWS\system32\secur32.dll', No symbols loaded.
'ConnerAssistant.exe': Loaded 'C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.2982_x-ww_ac3f9c03\comctl32.dll', No symbols loaded.
'ConnerAssistant.exe': Loaded 'C:\WINDOWS\system32\ole32.dll', No symbols loaded.
'ConnerAssistant.exe': Loaded 'C:\WINDOWS\system32\oleaut32.dll', No symbols loaded.
'ConnerAssistant.exe': Loaded 'C:\WINDOWS\system32\imm32.dll', No symbols loaded.
'ConnerAssistant.exe': Loaded 'C:\WINDOWS\system32\lpk.dll', No symbols loaded.
'ConnerAssistant.exe': Loaded 'C:\WINDOWS\system32\usp10.dll', No symbols loaded.
'ConnerAssistant.exe': Loaded 'C:\WINDOWS\WinSxS\x86_Microsoft.VC80.MFCLOC_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_91481303\mfc80ENU.dll', Binary was not built with debug information.
'ConnerAssistant.exe': Loaded 'C:\WINDOWS\system32\uxtheme.dll', No symbols loaded.
'ConnerAssistant.exe': Loaded 'C:\WINDOWS\system32\MSCTF.dll', No symbols loaded.
'ConnerAssistant.exe': Loaded 'C:\WINDOWS\system32\version.dll', No symbols loaded.
'ConnerAssistant.exe': Unloaded 'C:\WINDOWS\system32\version.dll'
'ConnerAssistant.exe': Loaded 'C:\WINDOWS\system32\MSCTFIME.IME', No symbols loaded.
'ConnerAssistant.exe': Loaded 'C:\WINDOWS\system32\IMSC40A.IME', No symbols loaded.
'ConnerAssistant.exe': Loaded 'C:\WINDOWS\system32\mslbui.dll', No symbols loaded.
'ConnerAssistant.exe': Loaded 'C:\WINDOWS\system32\shell32.dll', No symbols loaded.
'ConnerAssistant.exe': Loaded 'C:\WINDOWS\system32\clbcatq.dll', No symbols loaded.
'ConnerAssistant.exe': Loaded 'C:\WINDOWS\system32\comres.dll', No symbols loaded.
'ConnerAssistant.exe': Loaded 'C:\WINDOWS\system32\version.dll', No symbols loaded.
'ConnerAssistant.exe': Loaded 'D:\TlogDocEView.dll', Symbols loaded.
Warning: GetWindowMenuPopup failed!
TlogDocEView.dll被正确加载了,但是程序运行一会以后,就出现下面的output了,
Info: AfxDllCanUnloadNow returning S_OK
'ConnerAssistant.exe': Unloaded 'D:\TlogDocEView.dll'
,很奇怪,明明程序是在正确运行的,怎么突然就可以被卸载了呢?
然后就出错了
First-chance exception at 0x78324c2a (mfc80ud.dll) in ConnerAssistant.exe: 0xC0000005: Access violation reading location 0x10037dd4.
Unhandled exception at 0x78324c2a (mfc80ud.dll) in ConnerAssistant.exe: 0xC0000005: Access violation reading location 0x10037dd4.
,请看以下IDE调试callback堆栈,
> mfc80ud.dll!AfxAssertValidObject(const CObject * pOb=0x003abc00, const char * lpszFileName=0x782f1c28, int nLine=0x000001a7) Line 99 + 0xa bytes C++
mfc80ud.dll!CDocTemplate::AssertValid() Line 424 C++
mfc80ud.dll!CMultiDocTemplate::AssertValid() Line 213 C++
mfc80ud.dll!AfxAssertValidObject(const CObject * pOb=0x003ab9a8, const char * lpszFileName=0x782f2544, int nLine=0x00000367) Line 107 C++
mfc80ud.dll!CDocManager::AssertValid() Line 872 C++
mfc80ud.dll!AfxAssertValidObject(const CObject * pOb=0x003abae8, const char * lpszFileName=0x782f5700, int nLine=0x0000042b) Line 107 C++
mfc80ud.dll!CWinApp::AssertValid() Line 1068 C++
mfc80ud.dll!AfxAssertValidObject(const CObject * pOb=0x00430440, const char * lpszFileName=0x782f5388, int nLine=0x00000304) Line 107 C++
mfc80ud.dll!CWinThread::PreTranslateMessage(tagMSG * pMsg=0x00154098) Line 773 C++
mfc80ud.dll!AfxPreTranslateMessage(tagMSG * pMsg=0x00154098) Line 252 + 0x11 bytes C++
mfc80ud.dll!AfxInternalPumpMessage() Line 178 + 0x18 bytes C++
mfc80ud.dll!CWinThread::PumpMessage() Line 896 C++
mfc80ud.dll!CWinThread::Run() Line 625 + 0xd bytes C++
mfc80ud.dll!CWinApp::Run() Line 894 C++
mfc80ud.dll!AfxWinMain(HINSTANCE__ * hInstance=0x00400000, HINSTANCE__ * hPrevInstance=0x00000000, wchar_t * lpCmdLine=0x00020b32, int nCmdSh