2

みなさん、良い一日を!

プロジェクトで使用するdllを作成しました。クラスIのコンストラクタではライブラリをロードlib = LoadLibrary(L"library.dll");し、デストラクタでは次を使用してライブラリを解放します。 if (lib) FreeLibrary(lib);

FreeLibraryが呼び出されると、アプリケーションがブロックすることがありますが、何が間違っているのでしょうか。

dllMainを実装しましたが、これで問題が解決しません=(

.hファイル内

BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved );

extern "C" {
    static projector::CProjCorrectionsClient* corrections;

    void DLLPROJECTOR_EXPORT CorrectionsInit    (const char* configFile);
    void DLLPROJECTOR_EXPORT CorrectionsApply   ();
}

cppファイルで

BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved )
{
    switch( fdwReason )
    {
        case DLL_PROCESS_ATTACH:
            qDebug() << "DLL_PROCESS_ATTACH";
            corrections = new projector::CProjCorrectionsClient();
            break;

        case DLL_THREAD_ATTACH:
            break;

        case DLL_THREAD_DETACH:
            break;

        case DLL_PROCESS_DETACH:
            qDebug() << "DLL_PROCESS_DEATTACH";
            delete corrections;
            qDebug() << "Corrections delete success";
            break;
    }
    qDebug() << "Out side dllmain switch";
    return TRUE; 
}

コンソールに次のメッセージが表示されます。

DLL_PROCESS_ATTACH外部dllmainスイッチ<...>ライブラリを解放してみてくださいDLL_PROCESS_DEATTACH修正は成功を削除します外部dllmainスイッチ

FreeLibraryの呼び出しとアプリケーションのフリーズ後、メッセージは表示されません。

4

2 に答える 2

4

DLL_PROCESS_DETACH内のスレッドを待っていないことを確認してください。

DllMainが呼び出されると、システムは内部クリティカルセクションを取得します。これにより、DllMain内のコードがスレッドTの終了を待機している場合、デッドロックが発生する可能性があります。終了時にこのスレッドもDLL_PROCESS_DETACHを実行しますが、システムクリティカルセクションが取得されるため、無限に待機します。デッドロックを引き起こします。

于 2012-04-17T08:42:10.970 に答える
2

質問は多分-'dllが間違っているのは何ですか?'です。参照カウントがゼロに達したためにライブラリがアンロードされる場合、FreeLibraryはdllにクリーンアップの機会を与え、DLL_PROCESS_DETACHを使用してDllMainを呼び出します。おそらく、dllをデバッグして、このイベントが発生したときに何が起こっているかを確認してください。また、デストラクタを実行する可能性のある静的データがDLLにある場合、おそらく問題はそこにあります。

于 2012-04-17T08:30:17.687 に答える