1. ホーム
  2. c++

[解決済み] LoadLibraryAと相対パス

2022-03-01 03:03:14

質問

別のDLLから(LoadLibraryAを通して)DLLをロードしようとしています。 これは問題です。

c:\**EXE_DIR**\myExe.exe             // this exe load the MY_DLL_N1.dll
c:\**DLLS_DIR**\MY_DLL_N1.dll    // this dll load the MY_DLL_N2.dll
c:\**DLLS_DIR**\MY_DLL_N2.dll

  1. MY_DLL_N1.dllを読み込むと...正常に終了しました。
  2. MY_DLL_N1.dllはMY_DLL_N2.dll(同じディレクトリ)を(コードの下に)ロードしようとすると...ここに私の問題がある!...。

int LoadMyDLL()
{
    // ...

    // same path of the MY_DLL_N1.dll ... right?
    handle = LoadLibraryA ("MY_DLL_N2.dll");

    // ...
}

以上です......何かありましたら、よろしくお願いします。

解決方法は?

handle = LoadLibraryA ("MY_DLL_N2.dll");

パスを指定しないので DLL検索順 が使用されます。この場合、実行ファイルのディレクトリは検索されますが、ロードされるDLLSのディレクトリは検索されません。そのため、DLLを見つけることができません。

いくつかのオプションがあります。

  1. すべてのDLLSを実行ファイルと同じディレクトリに配置します。
  2. LoadLibraryを呼び出す際に、DLLのフルパスを渡します。
  3. 呼び出し SetDllDirectory を使用して、DLLディレクトリを検索パスに追加します。この呼び出しは、最初のDLLをロードする前に、実行ファイルから行ってください。一度これを行えば、最初のDLLをロードする際にフルパスを使用する必要はありません。

異なるアプリケーション間でDLLSを共有する必要がない限り、常にオプション1が好まれます。これにより、読み込んだDLLが正しいものであることを簡単に確認することができます。それは、実行可能なディレクトリが常に最初に検索されるからです。