-1

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); 
}
4

3 に答える 3

0

DisableThreadLibraryCallsの使用はお勧めしません、あなたはそれを見ましたか?

于 2009-03-15T01:03:00.977 に答える
0

投稿されたコードには、少なくとも 2 つの問題があります。

  1. DllMain で CoInitialize を呼び出しています。
  2. DllMain で COM オブジェクトを作成しています。
  3. CreateImageLists() で、DllMain で行うべきではないことを行っていても、驚かないでしょう。

また、スマート ポインターを使用しないことでクラッシュが「修正」された理由は、オブジェクトを実際に解放していないためです。コードが壊れており、参照を解放しないことは、何かを修正する有効な方法ではありません。

DllMainのドキュメントを読み、もう一度読み直すことをお勧めします。関数の実装内で絶対に行ってはならないことに特に注意してください。すぐ前に表示されるように:

警告 DLL エントリ ポイントで実行できる操作には重大な制限があります。より複雑な初期化を提供するには、DLL の初期化ルーチンを作成します。DLL 内の他のルーチンを呼び出す前に、アプリケーションが初期化ルーチンを呼び出すように要求できます。

これを読んで、有効なタイミングで COM オブジェクトを作成し、有効なタイミングでリリースするようにコードを修正すると、シェル拡張機能がクラッシュしなくなるのではないかと思います。

于 2009-03-20T16:40:03.210 に答える
-1

この問題は、XmlDomDocument に使用される COM スマート ポインターが原因でした。通常のポインターに変更したところ、Vista でも問題なく動作しています。

この問題は、XP と Vista では動作が異なります。XP では、Internet Explorer を閉じたときに未処理の例外が発生していました。Vista では、仮想ドライブを参照できませんでした。

于 2009-03-16T06:11:56.060 に答える