暗黙的または明示的に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. 暗黙的で明示的な関係を持つ多対多
- 3. Doctrine 2トランザクションの境界設定:暗黙的対明示的
- 4. 明示的インタフェース実装への暗黙インターフェイス実装のリファクタリング
- 5. IConvertible Vs.暗黙的/明示的な演算子型変換?
- 6. インターフェイスデザイン - 明示的または暗黙的な包含
- 7. Perl6:暗黙的および明示的なインポート
- 8. 明示的および暗黙的なXML名前空間
- 9. 暗黙的にリンクされたdllをリロードする方法
- 10. 明示的代入と暗黙的代入
- 11. 暗黙的/明示的な結合の違いは何ですか?
- 12. 暗黙的または明示的なコードブロックを使用する場合
- 13. DateTimeから暗黙的に暗黙的に暗黙的に暗黙的に暗黙的に暗黙的に暗黙的に暗黙変換に変換することができません
- 14. Dapper - オブジェクトへのSQLの暗黙的キャスト
- 15. Firebase AngularFire暗黙同期と明示的同期の違い
- 16. 暗黙のクラス対形質への暗黙の変換
- 17. は、暗黙的に
- 18. MessageVerifierのStringへのnilの暗黙的な変換なし
- 19. DLLの明示的な読み込み
- 20. 暗黙的に暗黙的に符号なしタイプに変換される
- 21. Scalaのシンプルな暗黙的な変換
- 22. WebDriverWaitタイムアウトは、明示的なタイムアウトではなく、ドライバの暗黙的なタイムアウトを待機します
- 23. "TypeError:文字列へのnilの暗黙的変換なし"
- 24. テンプレートの暗黙的パラメータ
- 25. LaTeXの式の暗黙的な改行
- 26. #pragmaの最後の暗黙的なバリア
- 27. intからvectorへの暗黙的な変換?
- 28. varcharからVarbinaryへの暗黙的な変換方法は?
- 29. 明示的なInterface実装で、同じ名前の暗黙的なプロパティを参照できますか?
- 30. Pythonでの暗黙的なモジュール検索?
明示的対暗黙的にはどういう意味ですか? LoadLibraryまたは静的リンクを使用することを意味しますか? – tenfour
@tenfour暗黙的には、.hibを使用し、LoadLibraryとGetProcAddressをそれぞれ使用するときに.libと明示的にリンクする必要があります。静的リンクは別のチューインガムです。 – Shinnok
時には、.libファイルを持っていないときに明示的に使用することがあります。 –