0

LoadLibrary()APIを使用して test.dll (VC++ - MFC) をロードできません。126 (Module not found)を使用してエラーコードを取得しますGetLastError()。依存関係ウォーカーによって、test.dll が "xerces-c_2_7.dll" と "Xalan-C_1_10.dll" に依存していることがわかりました。これらの dll は、exe と同じパスに既に存在していました。それでもエラーが発生します。LoadLibrary()そこで、返されたハンドルを として使用して、上記の両方のサードパーティの dll をロードしようとしまし0x10000000た。GetLastError()私が得ていることによって

error code 6 (Invalid Handle).

無効なハンドル エラーが発生する理由を教えてください。

以下はコード スニペットです。

HINSTANCE hLib = LoadLibrary(_T("Xalan-C_1_10"));
TCHAR szMessage[MAX_PATH];
FormatMessage(FORMAT_MESSAGE_IGNORE_INSERTS|
    FORMAT_MESSAGE_FROM_SYSTEM,
    NULL, GetLastError(),
    MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL),
    szMessage, MAX_PATH, NULL);
    hLib = LoadLibrary(_T("xerces-c_2_7"));
FormatMessage(FORMAT_MESSAGE_IGNORE_INSERTS|
    FORMAT_MESSAGE_FROM_SYSTEM,
    NULL, GetLastError(),
    MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL),
    szMessage, MAX_PATH, NULL);
4

2 に答える 2

1

あなたの問題を抽出して、私は集めます:

  • Xerces と Xalan を個別にロードすることはできますが、test.dll ファイル (他の dll を参照する) をロードすることはできません。

  • GetLastError()Xerces または Xalan をロードするときに返される値に惑わされる可能性があります。

GetLastError()電話の直後に電話する必要があることに注意してくださいLoadLibrary: MSDN ドキュメントから:

関数の戻り値が、そのような呼び出しが有用なデータを返すことを示している場合は、すぐに GetLastError 関数を呼び出す必要があります。これは、関数によっては、成功したときにゼロを指定して SetLastError を呼び出し、最後に失敗した関数によって設定されたエラー コードを消去するためです。

これはおそらく依存関係/パス解決の問題です (つまりLoadLibrary、要求されたイメージが見つかりません)。したがって、次の 2 つのオプションがあります。

  • test.dll/Xerces/Xalan には、実行可能ファイルのフォルダーにコピーしていない他の依存関係がありますか?

  • dll を Windows\System32 フォルダに入れて、もう一度やり直してください。これが機能する場合は、パスの問題に遭遇したことを確認できます。MSDN のページを読んでくださいLoadLibrary。少しわかりにくいですが、省略しやすい詳細がいくつかあります。

  • GetCurrentDirectoryおよびを使用SetCurrentDirectoryして、アプリケーションの実行フォルダーと dll の常駐フォルダーを切り替えます。

  • への呼び出しで dll へのフル パスを指定しLoadLibraryます。パス名に空白が含まれていると、問題が発生する可能性があります (これは記憶から思い出しました。MSDN で確認してください)。

  • 完了したら、善良な市民になり、電話してFreeLibraryください!

于 2009-10-26T13:46:36.750 に答える
0

test.dll はあなたの DLL ですか、それともサードパーティの DLL ですか?

If it is a your DLL, 

コード内の依存 DLL とその正確なパスを簡単に確認できるはずです。

If it is third party DLL,

Windows パス、プログラム ファイル パス、テスト DLL パスなどを試す必要があります。ドキュメント化されていない場合、DLL の作成者のみが知っているパスを参照する場合があります) 。

この回答がお役に立てば幸いです。

于 2010-04-15T09:22:48.110 に答える