3

Windows のコードに dll をロードしようとしています。LoadLibrary() 関数を使用して dll を正常にロードしましたが、質問があります。次のように dll へのパスを指定します。

LoadLibrary(C:\\path\\to\\my\\dll);

私のdllへの相対パスを与えることができるかどうか疑問に思います。たとえば、次のようになります。

LoadLibrary(.\my dll directory\my dll.dll)

出来ますか?そうでない場合、別のマシンでdllへのパスを変更せずに移植可能なプロジェクトを開発するにはどうすればよいですか?

4

2 に答える 2

11

LoadLibrary への 2 回目の呼び出しでバックスラッシュをエスケープするのを忘れたため、失敗した可能性が最も高いです。ファイル名の引用符も忘れたため、質問を書いたときのタイプミスだったのかもしれません。;) つまり、次の行を変更します。

LoadLibrary(.\my dll directory\my dll.dll);

これになるには:

LoadLibrary(L".\\my dll directory\\my dll.dll");

(そして、リーディング.\\が必要かどうかはわかりません)

それでも問題が解決しない場合は、これでおそらく必要なことが行われます。

wchar_t szFullPath[MAX_PATH] = {};
GetCurrentDirectory(MAX_PATH, szFullPath);
PathCchAppend(szFullPath, MAX_PATH, L"my dll directory\\my dll.dll");
HMODULE hDLL = LoadLibrary(szFullPath);

最後に、LoadLibrary は、依存する DLL を検索するためのさまざまな動作をします。また、パスの指定方法によっても異なります。それが、相対検索パスから DLL をロードする能力に影響を与えている可能性があります。MSDN ページを読んで、 LoadLibraryExSetDllDirectoryなどのさまざまなオプション呼び出しを調べて、検索パスを処理しやすくすることを検討してください。DLL 検索パスに関するこのページも同様です。

于 2013-02-25T09:00:49.837 に答える
2

まず第一に、私はあなたが書くつもりだったと思います:

LoadLibrary(".\\my dll directory\\my dll.dll");

ドキュメントはあなたの質問に答えます:

相対パスを指定すると、相対パス全体が DLL 検索パス リスト内のすべてのトークンに追加されます。他のパスを検索せずに相対パスからモジュールをロードするには、GetFullPathName を使用して非相対パスを取得し、非相対パスで LoadLibrary を呼び出します。

はい、相対パスを指定できます。しかし、それが解釈される方法は、おそらくあなたが期待していたものではありません. DLL 検索は、DLL 検索パスの各パスを順番に取得し、それを相対パスと組み合わせて、その DLL をロードしようとします。

したがって、相対パスを現在の作業ディレクトリからの相対パスにしたい場合は、 を呼び出しGetFullPathNameて絶対パスに展開し、それをロードします。相対パスを他のディレクトリからの相対パスとして解釈する場合は、そのディレクトリと組み合わせて、DLL を絶対パスでロードします。

于 2013-02-25T09:22:36.030 に答える