モジュール定義マネージャ: IMPDEF.EXE

提供: RAD Studio
移動先: 案内検索

コマンドライン ユーティリティ:インデックス への移動

メモ: IMPDEF は、現在 Win32 アプリケーションでのみ使用できます。
Win64 アプリケーションでは、64 ビット Windows 版 C++ インポート ライブラリ ツール: MKEXP.EXE を使用してください。

インポート ライブラリは、Windows DLL 内の関数にアクセスできるようにするものです。 インポート ライブラリには一連の記録が格納されています。 それぞれの記録には DLL の名前が記載されており、インポートされる関数がその DLL のどこに存在しているかを指定します。 これらの記録はリンカによってアプリケーションにバインドされ、DLL 関数呼び出しの解決に必要な情報を Windows に提供します。 モジュール定義ファイルの IMPORTS セクションの一部または全部をインポート ライブラリで代用することができます。

IMPDEF は DLL 名を入力として受け取り、その DLL からエクスポートされている関数の名前が EXPORTS セクションに記述されたモジュール定義ファイルを出力として生成します。

コマンドライン構文

IMPDEF <options> <destination.def> <source.dll> 

コマンドラインのヘルプを表示するには、次のように入力します:

impdef 


コマンドライン オプション

オプション 説明
-a

Microsoft ライブラリとの互換性を保つために、cdecl 関数に対する _ エイリアスを追加します。

-h

ヒントを出力します。


以下に例を示します。

IMPDEF DestName.DEF SourceName.DLL

上記の場合、DLL ファイル SourceName.DLL からモジュール定義ファイル DestName.DEF が生成されます。 生成されるモジュール定義ファイルは、次のようになります。

LIBRARY     <FileName>
DESCRIPTION '<Description>'
EXPORTS
            <ExportFuncName>              @<Ordinal>
        .
        .
        .
            <ExportFuncName>              @<Ordinal>
  • <ファイル名>: DLL のルート ファイル名です。
  • '<説明>': DESCRIPTION 文を含んだモジュール定義ファイルでリンクされた DLL の場合は、その DESCRIPTION 文の値です。
  • <エクスポート関数名>: エクスポートされている関数の名前です。
  • <順序値>: その関数の順序値(整数)です。


DLL 内のクラス

IMPDEF は C++ クラスを使用する DLL に役に立ちます。 クラスを定義する際に __declspec(または _export)キーワードを使用した場合、そのクラスの非インライン メンバ関数と静的(static)データ メンバはすべてエクスポートされます。 モジュール定義ファイルにはエクスポートされている関数がすべて列挙されており、メンバ関数と静的(static)データ メンバの記述が自動的に含まれるため、IMPDEF でモジュール定義ファイルを作成するほうが簡単です。

これらの関数の名前はマングル(変換)されているため、モジュール定義ファイルからインポート ライブラリを作成するためだけに、そのモジュール定義ファイルの EXPORTS セクションにそれらの関数名をすべて列挙するのは面倒でしょう。 IMPDEF を使用してモジュール定義ファイルを作成した場合、その中にはエクスポートされている各関数の順序値が記載されています。 エクスポート名がマングルされている場合、IMPDEF で生成されるモジュール定義ファイルでは、その関数のマングルされていない元の名前が関数項目の後にコメントとして記載されています。 そのため、生成されるモジュール定義ファイルは次のようになります。

LIBRARY     <FileName>
DESCRIPTION '<Description>'
EXPORTS
            <MangledExportFuncName>  @<Ordinal> ; <ExportFuncName>
        .
        .
        .
            <MangledExportFuncName>  @<Ordinal> ; <ExportFuncName>
  • <ファイル名>: DLL のルート ファイル名です。
  • '<説明>': DESCRIPTION 文を含んだモジュール定義ファイルでリンクされた DLL の場合は、その DESCRIPTION 文の値です。
  • <マングルされたエクスポート関数名>: マングルされた関数名を示します。
  • <順序値>: その関数の順序値(整数)です。
  • <エクスポート関数名>: 関数の元の名前を示します。


DLL 内の関数

IMPDEF を実行すると、DLL でエクスポートされている関数をすべて列挙した編集可能なソース ファイルが生成されます。 この .DEF ファイルを編集して、特定のアプリケーションに公開する関数のみが含まれるようにした後、編集した .DEF ファイルに対して IMPLIB を実行することができます。 その結果、DLL のエクスポート関数の限定的なサブセットに関するインポート情報が記述されているインポート ライブラリが生成されます。

複数のアプリケーションで使用される関数を提供する DLL を配布しようとしているとしましょう。 DLL 内のエクスポート関数はすべて、__declspec(または _export)を付けて定義されます。 さて、すべてのアプリケーションでこの DLL のエクスポート関数が全部使用されるのであれば、IMPLIB を使用して DLL のインポート ライブラリを 1 つ作成することができます。 そのインポート ライブラリを DLL と一緒に配布することができ、インポート ライブラリは DLL の全エクスポート関数のインポート情報を提供することになります。 インポート ライブラリはどのようなアプリケーションにもリンクできるため、特定のアプリケーションで使用する DLL 関数をすべてアプリケーションのモジュール定義ファイルの IMPORTS セクションに列挙する必要はなくなります。

しかし今度は、特定のアプリケーションに DLL のエクスポート関数の一部のみ提供するとしましょう。 理論上は、カスタマイズされたインポート ライブラリ(アプリケーションで使用する一部の関数のインポート情報のみ提供するインポート ライブラリ)を、そのアプリケーションにリンクすることになります。 DLL に含まれている他のエクスポート関数はすべて、そのクライアント アプリケーションからは見えなくなります。

これらの条件を満たすインポート ライブラリを作成するには、コンパイルおよびリンクされた DLL に対して IMPDEF を実行します。 IMPDEF を実行すると、DLL のすべてのエクスポート関数が EXPORT セクションに列挙されたモジュール定義ファイルが生成されます。 そのモジュール定義ファイルを編集し、カスタマイズしたインポート ライブラリに含めない関数の EXPORTS セクション項目を削除した後、編集後のモジュール定義ファイルに対して IMPLIB を実行することができます。 その結果、モジュール定義ファイルの EXPORTS セクションに列挙されたエクスポート関数のインポート情報のみ記述されたインポート ライブラリができあがります。

関連項目