Visual Studio 2008 を使用して、C++ (ATL 9) でシェル拡張機能を作成しています。シェル拡張機能は、モジュール クラスにグローバルな MSXML2::IXMLDOMDocumentPtr オブジェクト m_XmlDoc を作成します。この m_XmlDoc は、xml ドキュメントを読み取るためにすべてのクラスによって拡張機能で使用されます。
私が直面している問題は、Internet Explorer にあります。シェル拡張機能がアクティブなときに Internet Explorer を開いたり閉じたりすると、デバッグ ダイアログが表示されて IE がクラッシュします。エラー メッセージには、「iexplore.exe の 0x6aac30f1 で未処理の例外: 0xC0000005: アクセス違反の読み取り場所 0x03050970」と表示されます。メッセージ ウィンドウで [break] をクリックすると、COM Smart Pointer の [Release] メソッドに移動し、エラーは m_pInterface->Release(); にあるようです。
この呼び出しはモジュールのデストラクタから行われ、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);
}