8

Windows環境では、

DLL を自分のプログラムに明示的に(LoadLibrary を使用して) リンクしようとしたとき、

  • 最初に、DLL 内の各関数シグネチャに従って関数ポインターを定義する必要があります。
  • 次に、「GetProcAddress」を使用して関数アドレスを取得し、それらのポインターに割り当てます。

DLL を自分のプログラムに暗黙的にリンクしようとしたとき(ヘッダー ファイルを使用)

  • まず、関数シグネチャを取得するために関連するヘッダー ファイルが必要です。
  • Lib次に、DLL で生成された関連ファイルが必要です。

    私の質問は

    1. Lib暗黙的なリンクにもファイルが必要なのはなぜですか?
    2. DLLまたはから取得できない「Lib」ファイルから取得する必要がある情報は何Header fileですか?
    3. 質問 2 について何かあれば、明示的にロードするときにどのように情報が取得されますか?

私はすでにこの質問を経験しました。しかし、私には正当な理由が理解できません。誰かがこれを簡単な言葉で説明するのを手伝ってくれませんか。ありがとうございました。

4

2 に答える 2

3

暗黙的なリンクには Lib ファイルも必要な理由。

.libs には dll のインポート情報dumpbinが含まれており、Windows/Visual Studio SDK に含まれているコマンドを使用して情報を確認できます。

これは、たとえば ws2_32.lib 内の recv のリンク情報です。

Version      : 0
Machine      : 14C (x86)
TimeDateStamp: 4907F6ED Wed Oct 29 01:38:53 2008
SizeOfData   : 00000014
DLL name     : WS2_32.dll
Symbol name  : _recv@16
Type         : code
Name type    : ordinal
Ordinal      : 16

ws2_32.dll 内に序数と名前があることを確認できます (DLL をインポートするようになっていることを確認してください)。

DLL またはヘッダー ファイルから取得できない「Lib」ファイルから取得する必要がある情報

ヘッダー ファイルには、インポートを抽出する場所からの情報がないため、コンパイル時にインポート (__imp__name) としてマークされ、.lib に対してリンクされると、名前が解決されます。

  • .lib 内にある場合は、それに対してリンクするだけです。
  • ただし、外部参照 (DLL) に関する情報がある場合は、インポート テーブル内にインポートが作成されるため、動的に読み込まれます。

質問 2 に何かあれば、明示的な読み込み時にそれらの情報を取得する方法。

明示的な読み込みで LoadLibrary を意味する場合は、リンク時ではなく実行時にそれを伝えています。そのため、PE ローダーは PATH 内の DLL を検索し、動的にロードします。次に、エクスポートされた関数のアドレスを取得する他の関数があります。

何かわからないことがあれば、私に聞いてください。もっとよく理解したい場合は、dumpbin で遊んでみて、PE について読んでください。

于 2013-07-24T04:58:42.753 に答える
2

暗黙的にリンクする場合、関数宣言は、プログラムで使用される名前、およびプロトタイプと呼び出し規約を指定します。しかし、より多くの情報が必要です。具体的には:

  1. 関数が外部の DLL に実装されているという事実。
  2. その DLL の名前。
  3. 関数のエクスポートされた名前。これは、DLL から関数をエクスポートするために使用される名前であり、インポート時に使用される名前とは異なる場合があります。

一部の言語設計者は、言語拡張機能を使用してこの情報を提供することを選択しました。たとえば、Delphi はこのルートを採用しました。暗黙的なリンクは、.lib ファイルを使用せずにコードで完全に指定されます。一方、C および C++ の規則では、不足している情報を指定するために .lib ファイルを使用します。

于 2014-08-13T07:15:44.333 に答える