2

アンマネージdllをラップするマネージc++/cliプロジェクトがあります。

アンマネージdllをでロードしましたLoadLibraryが、LoadLibrary呼び出しでdllが見つかりません。

  HMODULE theDllHell = LoadLibrary(L"mylib.dll");

dllが出力ディレクトリにコピーされるようにするにはどうすればよいですか?また、どのパスに指定する必要がありLoadLibraryますか?

4

2 に答える 2

1

現在のディレクトリまたはexeディレクトリからライブラリをロードするには、パスなしでライブラリ名だけで十分です。完全なDll検索順序については、ダイナミックリンクライブラリの検索順序http://msdn.microsoft.com/en-us/library/windows/desktop/ms682586%28v=vs.85%29.aspxを参照してください。

アプリケーションがロードされたディレクトリ。
現在のディレクトリ。
システムディレクトリ。GetSystemDirectory関数を使用して、このディレクトリのパスを取得します。
16ビットシステムディレクトリ。このディレクトリのパスを取得する関数はありませんが、検索されます。
Windowsディレクトリ。GetWindowsDirectory関数を使用して、このディレクトリのパスを取得します。
PATH環境変数にリストされているディレクトリー。

ライブラリを出力ディレクトリにコピーする場合は、このライブラリプロジェクトをソリューションに追加します。追加モジュールは同じディレクトリにあります。mylibプロジェクトのビルド後の手順を使用して、mylib.dllを必要なディレクトリにコピーすることもできます。

于 2012-11-07T09:53:22.057 に答える
1

最初:DLLがプロジェクトに追加されており、SolutionExplorerパネル内に表示されていると仮定して、DLLを右クリックして次の手順を実行します。

  • BuildActionで「コンテンツ」に
  • CopyToOutputDirで「CopyIfNewer」を選択します

オプションを覚えていなかった場合は、妥当な場合はいつでも出力ディレクトリにコピーする必要があります。参照:MSDNのファイルプロパティ

2番目:LoadLibraryは、従来のWindows固有の順序で一連のパスを検索します。ほとんどの場合、確実にできるパスは次のとおりです。

  • 現在のworkindディレクトリ
  • %windir%\system32などのシステムDLLディレクトリ

ドキュメントを確認してください:LoadLibraryA関数には、たとえば「SetDllDirectory」があり、非常に便利です。また、詳細に説明されている検索パスの順序は次のとおりです。ダイナミックリンクライブラリの検索順序

編集:もちろん、ファイルへのCWD相対パスまたは完全絶対パスをLoadLibraryに指定するだけで済みます。これで常に問題は解決しますが、アプリをOSのさまざまなバージョンや言語で実行する場合、パスを手動で決定するのは簡単な作業ではない可能性があるため、お勧めしません。

于 2012-11-07T09:53:53.510 に答える