2017-09-22 10 views
0

私はウェブを検索しましたが、私のクエリとは異なる回答をしています。私はWindowsの専門家ではありませんが、正確に理解したいと思います。コンパイル時にWindowsアプリケーションがDLLについて知る必要があります

アプリケーションがWindows用にコンパイルされている場合、コアライブラリkernel32.dllやその他のユーザー作成のdllを使用するなど、ライブラリ(DLL)のランタイムリンクの必要性が伴います。 dllは実行時より前に存在します。

私はdllにコンパイル時にリンクする必要がある.libファイルが付随する必要がありますが、.libファイルが必要でないことを示していることがあります。

アプリケーションは単に実行し、dllに必要な機能を見つけ出し、見つからない場合は失敗するでしょうか?

ありがとうございます。

+0

はい。 DLLを見つけて関数をバインドするのは、OSローダーの仕事です。技術的には、LoadLibrary + GetProcAddressを使用して、プログラム自体によって動的に行うことができます。 COMは注目に値するですが、クラスファクトリであるエクスポートされた関数は1つだけ必要です。 –

+0

異なる回答が表示される理由は、状況によって異なります。どんなものであれ、 'kernel32.lib'が必要です。なぜなら、LoadLibraryとGetProcAddressをどこから取得するのでしょうか。 [Nitpicksコーナー:はい、技術的には他の方法もありますが、OPの文脈では関係ありません。]通常、他のほとんどのDLLには '.lib'ファイルも使用します。しかし、あなたはそれらなしですることができます。また、プラグインなど、あらかじめわからない名前のDLLをロードする必要がある場合は、そうすることができます。 –

答えて

-1

動的にリンクされた機能のリストは、オプションヘッダーの2番目のディレクトリ項目で定義されているPECOFF実行ファイルのインポートセクションに保持されます。セクションの通常の名前は.idataまたはです。IMPORTです。インポートディレクトリに保存 必要な情報だけがそう答えは否定的で、リンカがする必要はありません

  1. 関数の名前
  2. (パスなし)動的ライブラリのファイル名

ですDLLについて何か知っていて、リンク時に必ずしも存在する必要はありません。実行時に参照されたDLLを見つけることはローダーの仕事です(そして、エラー、エントリポイントFunctionNameが最終的にライブラリに見つかりません)。なぜなら、インポート機能とそのDLLを宣言するためのディレクティブが不足しているので、彼らは間接的なプロキシがIATにジャンプインポート定義を含み、またリンクされたライブラリを必要とする古いコンパイラとリンカーの存在の.lib

インポートライブラリ。しかし、この情報は即座にで作成できるので、良いリンカはこれを必要としません。

関連する問題