2011-01-25 43 views
7

暗黙的または明示的にDLLにリンクする必要があり、一般的なプラクティスまたは落とし穴は何ですか?暗黙的対DLLへの明示的なリンク

+1

明示的対暗黙的にはどういう意味ですか? LoadLibraryまたは静的リンクを使用することを意味しますか? – tenfour

+1

@tenfour暗黙的には、.hibを使用し、LoadLibraryとGetProcAddressをそれぞれ使用するときに.libと明示的にリンクする必要があります。静的リンクは別のチューインガムです。 – Shinnok

+1

時には、.libファイルを持っていないときに明示的に使用することがあります。 –

答えて

8

DLLを明示的にリンクすることは非常にまれです。主にそれは痛みがありエラーが発生しやすいからです。エクスポートされた関数の関数ポインタ宣言を記述し、LoadLibrary + GetProcAddress + FreeLibraryコードを取得する必要があります。プラグインスタイルのDLLにランタイム依存関係が必要な場合や、設定に基づいて一連のDLLから選択したい場合にのみ、そうします。または、バージョン管理(Windowsのそれ以降のバージョンでのみ使用可能なAPI関数など)を処理する。明示的なリンクは、COMおよび.NET DLLのデフォルトです。

この背景情報はMSDN Library articleにあります。

4

私は.libを使ってリンクを参照していると仮定していますが、LoadLibrary()を使ってDLLを動的にロードしています。

DLLをその.libにリンクして静的にロードすることは、一般的に安全です。リンクステージでは、コンパイル時にすべてのエントリポイントが存在することが確認され、期待している機能を持たないDLLを読み込むことはありません。 GetProcAddress()を使用しない方が簡単です。

一般に、動的ロードは絶対に必要な場合にのみ使用してください。

5

私はすでにあなたに答えた他の人に同意します(Hans Passant and shoosh)。

LoadLibraryGetProcAddressを使用する必要がある場合の一般的なシナリオは次のとおりです。新しいバージョンのWindowsにのみ存在する新しいAPIを使用したいが、あなたのAPIは重要ではない応用。したがって、必要な機能が存在するかどうかは、LoadLibraryGetProcAddressでテストして、その場合に使用してください。関数が存在しない場合のプログラムの動作は、実装の合計によって異なります。

2)あなたの質問には含まれていない重要なオプションが1つあります:delayed loading of DLLsです。この場合、オペレーティングシステムは、その関数の1つが呼び出されたときにDLLをロードし、アプリケーションの開始時にDLLをロードしません。明示的にリンクする必要があるシナリオでは、インポートライブラリ(.libファイル)を使用することができます。さらに、アプリケーションの起動時間を改善し、Windows自体によって幅広く使用されます。だからその方法もお勧めします。

+0

遅延読み込みは、OSではなくVisual Studioリンカによって実装されます。これは適切な 'LoadLibrary'と' GetProcAddress'呼び出しをあなたのために挿入します。 OSは誰がこれらの呼び出しを行うのか分からない。だからこそ、この機能が98に導入されたとしても、それはWindow95に戻ってしまうのです。 – MSalters

+0

@MSalters:間違っています。プログラム実行可能(PE)の遅延ロードには、追加の 'IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT'セクションがあります。 – Oleg

関連する問題