我正在使用 Visual Studio 2008 在 C++ (ATL 9) 中创建一个外壳扩展。外壳扩展在模块类中创建一个全局 MSXML2::IXMLDOMDocumentPtr 对象 m_XmlDoc。然后所有类在扩展中使用这个 m_XmlDoc 来读取 xml 文档。
我面临的问题是 Internet Explorer。当 Shell 扩展处于活动状态并且我打开/关闭 Internet Explorer 时,我得到一个调试对话框并且 IE 崩溃。错误消息显示“iexplore.exe 中 0x6aac30f1 处的未处理异常:0xC0000005:访问冲突读取位置 0x03050970。” 当我在消息窗口上单击“中断”时,它会将我带到 COM 智能指针的“释放”方法,错误似乎在 m_pInterface->Release();
此调用是从 Module 的析构函数进行的,并且 m_pInterface 的值也不为 NULL。我想也许 Internet Explorer 正在使用 XML DOM,并且对 Release 的调用会在其中产生一些问题。
MSXML2::IXMLDOMDocumentPtr m_XmlDoc;
In _AtlModule.Init() method
::CoInitialize(NULL);
m_XmlDoc.CreateInstance(MSXML2::CLSID_DOMDocument40);
dll主要代码:
extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
::CoInitialize(NULL);
if (dwReason == DLL_PROCESS_ATTACH)
{
_AtlModule.Init();
CreateImageLists();
::DisableThreadLibraryCalls(hInstance);
}
hInstance;
return _AtlModule.DllMain(dwReason, lpReserved);
}