4

LoadLibrary を使用して別の DLL (winsock) を動的にロードする DLL を作成しています。DllMain で LoadLibrary を呼び出すべきではないことを読みましたが、繰り返し使用しているため、使用するたびに LoadLibrary/GetProcAddress を呼び出す必要はありません。だから私の質問は:

  • DLL 内で LoadLibrary を呼び出すのに最適な場所はどこですか?

  • LoadLibrary/GetProcAddress の速度はどのくらいですか? 各関数でそうするのはオーバーヘッドが大きいですか?

4

1 に答える 1

4

DllMain の外部でセットアップを行う初期化関数を作成します。コードは、DLL がロードされた後にその関数を呼び出します。これにより、初期化を完了するために必要なものを呼び出すことができます。

LoadLibrary() の呼び出しは 1 回だけにしてください。OS は続行する前にすべての依存関係が読み込まれていることを確認し、プロセス内にスペースを確保する必要があるため、費用がかかります。DLL が既にロードされている場合は、ディスクからロードする必要がある場合よりもはるかに高速です。

GetProcAddress() も、関数ごとに 1 回だけ呼び出す必要があります (理想的には)。関数は、DLL のエクスポート テーブルを調べて、名前で関数を見つける必要があります。これには、アドレスを見つけるための文字列の比較が含まれます。後でアドレスをキャッシュして、次回直接呼び出すことができるようにします。

于 2012-11-03T01:46:51.280 に答える