アンマネージdllをラップするマネージc++/cliプロジェクトがあります。
アンマネージdllをでロードしましたLoadLibrary
が、LoadLibrary
呼び出しでdllが見つかりません。
HMODULE theDllHell = LoadLibrary(L"mylib.dll");
dllが出力ディレクトリにコピーされるようにするにはどうすればよいですか?また、どのパスに指定する必要がありLoadLibrary
ますか?
現在のディレクトリまたは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を必要なディレクトリにコピーすることもできます。
最初:DLLがプロジェクトに追加されており、SolutionExplorerパネル内に表示されていると仮定して、DLLを右クリックして次の手順を実行します。
オプションを覚えていなかった場合は、妥当な場合はいつでも出力ディレクトリにコピーする必要があります。参照:MSDNのファイルプロパティ
2番目:LoadLibraryは、従来のWindows固有の順序で一連のパスを検索します。ほとんどの場合、確実にできるパスは次のとおりです。
ドキュメントを確認してください:LoadLibraryA関数には、たとえば「SetDllDirectory」があり、非常に便利です。また、詳細に説明されている検索パスの順序は次のとおりです。ダイナミックリンクライブラリの検索順序
編集:もちろん、ファイルへのCWD相対パスまたは完全絶対パスをLoadLibraryに指定するだけで済みます。これで常に問題は解決しますが、アプリをOSのさまざまなバージョンや言語で実行する場合、パスを手動で決定するのは簡単な作業ではない可能性があるため、お勧めしません。