暗黙的または明示的にDLLにリンクする必要があり、一般的なプラクティスまたは落とし穴は何ですか?暗黙的対DLLへの明示的なリンク
答えて
DLLを明示的にリンクすることは非常にまれです。主にそれは痛みがありエラーが発生しやすいからです。エクスポートされた関数の関数ポインタ宣言を記述し、LoadLibrary + GetProcAddress + FreeLibraryコードを取得する必要があります。プラグインスタイルのDLLにランタイム依存関係が必要な場合や、設定に基づいて一連のDLLから選択したい場合にのみ、そうします。または、バージョン管理(Windowsのそれ以降のバージョンでのみ使用可能なAPI関数など)を処理する。明示的なリンクは、COMおよび.NET DLLのデフォルトです。
この背景情報はMSDN Library articleにあります。
私は.lib
を使ってリンクを参照していると仮定していますが、LoadLibrary()
を使ってDLLを動的にロードしています。
DLLをその.lib
にリンクして静的にロードすることは、一般的に安全です。リンクステージでは、コンパイル時にすべてのエントリポイントが存在することが確認され、期待している機能を持たないDLLを読み込むことはありません。 GetProcAddress()
を使用しない方が簡単です。
一般に、動的ロードは絶対に必要な場合にのみ使用してください。
私はすでにあなたに答えた他の人に同意します(Hans Passant and shoosh)。
LoadLibrary
とGetProcAddress
を使用する必要がある場合の一般的なシナリオは次のとおりです。新しいバージョンのWindowsにのみ存在する新しいAPIを使用したいが、あなたのAPIは重要ではない応用。したがって、必要な機能が存在するかどうかは、LoadLibrary
とGetProcAddress
でテストして、その場合に使用してください。関数が存在しない場合のプログラムの動作は、実装の合計によって異なります。
2)あなたの質問には含まれていない重要なオプションが1つあります:delayed loading of DLLsです。この場合、オペレーティングシステムは、その関数の1つが呼び出されたときにDLLをロードし、アプリケーションの開始時にDLLをロードしません。明示的にリンクする必要があるシナリオでは、インポートライブラリ(.lib
ファイル)を使用することができます。さらに、アプリケーションの起動時間を改善し、Windows自体によって幅広く使用されます。だからその方法もお勧めします。
- 1. 暗黙的対明示的なインタフェース
- 2. 暗黙的と明示的な.NETスレッディング
- 3. 暗黙的で明示的なキャスト
- 4. 暗黙的で明示的な関係を持つ多対多
- 5. Doctrine 2トランザクションの境界設定:暗黙的対明示的
- 6. IReadOnlyCollectionでの暗黙的/明示的なキャストの混乱
- 7. フレームワーク内の暗黙的および明示的な待機アプローチ
- 8. 明示的インタフェース実装への暗黙インターフェイス実装のリファクタリング
- 9. インターフェイスデザイン - 明示的または暗黙的な包含
- 10. IConvertible Vs.暗黙的/明示的な演算子型変換?
- 11. Perl6:暗黙的および明示的なインポート
- 12. 明示的および暗黙的なXML名前空間
- 13. 明示的に定義された明示的コンストラクタ対暗黙的に定義されたコンストラクタ
- 14. 暗黙的にリンクされたdllをリロードする方法
- 15. OpenCLの "ループ展開"は暗黙的か明示的か?
- 16. ベストプラクティス:関数内のローカル変数(明示的か暗黙的か)
- 17. IdentityServer3の暗黙的なフローではなく、暗黙的なjavascript
- 18. 明示的代入と暗黙的代入
- 19. 明示的または暗黙的vec4 in glsl
- 20. 明示的なインポートがない暗黙ですか?
- 21. 暗黙的なプロパティタイプは、明示的なプロパティタイプと同じですか?
- 22. 暗黙的/明示的な結合の違いは何ですか?
- 23. DateTimeから暗黙的に暗黙的に暗黙的に暗黙的に暗黙的に暗黙的に暗黙的に暗黙変換に変換することができません
- 24. 暗黙的または明示的なコードブロックを使用する場合
- 25. インデックス・スキャンおよび暗黙的または明示的なデータconvesion
- 26. 明示的にデフォルトした関数は、暗黙的な宣言が
- 27. 明示的な 'this'バインディング優先順位と暗黙的 'this'バインディング優先順位
- 28. Dapper - オブジェクトへのSQLの暗黙的キャスト
- 29. C#で明示的に変換する文字から暗黙の変換へ
- 30. スカラ:暗黙的に暗黙のクラスに
明示的対暗黙的にはどういう意味ですか? LoadLibraryまたは静的リンクを使用することを意味しますか? – tenfour
@tenfour暗黙的には、.hibを使用し、LoadLibraryとGetProcAddressをそれぞれ使用するときに.libと明示的にリンクする必要があります。静的リンクは別のチューインガムです。 – Shinnok
時には、.libファイルを持っていないときに明示的に使用することがあります。 –