1

私は C++ でプログラミングしており、Visual Studio 2008、Windows XP を使用しており、次の問題があります: Python から使用できる DLL である私のアプリケーションは、外部 dll をロードし、必要なメソッドを使用し、次に、この外部 Dll をアンロードします。正常に動作していますが、1000 サイクルを超えると、メソッド「LoadLibraryA」は NULL 参照を返します。

主な手順は次のとおりです。

HINSTANCE h = NULL;
h = LoadLibraryA(dllfile.c_str());
DWORD dw = GetLastError(); 

得られたエラーは次のとおりです。

ERROR_DLL_INIT_FAILED
1114 (0x45A) A dynamic link library (DLL) initialization routine failed.

Dll は、次を使用してアンロードされます。

FreeLibrary(mDLL);
mDLL = NULL;

mDLL は次のように定義されています。

HINSTANCE mDLL;

最初に試みた代替方法: Dll を 1 回だけロードし、アプリケーションの終了時にアンロードします。これで問題は解決しますが、新しい問題が発生します。

アプリケーションが終了すると、最初にアプリケーションの DllMain メソッドを実行する代わりに、外部 DLL をアンロードし、最初に他の Dll の DllMain メソッドを実行します。これにより、アプリケーションが以前に単独でアンロードされた Dll をアンロードしようとしているため、次のエラーが発生します。

「Python.exe の 0x04a00d07 (DllName.DLL) で未処理の例外: 0xC0000005: アクセス違反の読み取り場所 0x0000006b」.

どんな提案も歓迎します。前もって感謝します。よろしく。

4

1 に答える 1

1

ロード/アンロードされたライブラリの初期化コードがメモリ リークしないことを確認してください。多くのライブラリは一度だけ読み込まれることを想定しており、常にリソースを適切にクリーンアップするとは限りません。

たとえば、最上位の C++ ファイルでは、次のように変数を宣言して初期化できます。

AClass *a = new AClass(1,2,3);

ライブラリが自動的にロードされると、コードが実行されます。しかし、ライブラリはいつ/どのようにアンロードされるかを正確に認識していないため、ハングしているインスタンスを解放することはできません。この場合、「AClass *a」を「AClass a」に置き換えるか、ライブラリ用に独自のDllMainを作成し、DLL_PROCESS_DETACH でリソースを解放することができます。

ライブラリのコードを制御できない場合は、読み込まれたライブラリのキャッシュを作成し、それらをアンロードしないことが理にかなっています。そのようなキャッシュを過負荷にするライブラリが無限にあるとは想像しがたいです。

于 2010-06-10T22:31:04.393 に答える