情報: _declspec(dllimport) & _declspec(dllexport) 内のコードを使用します。

文書翻訳 文書翻訳
文書番号: 132044
すべて展開する | すべて折りたたむ

目次

概要

この資料で、次の資料で説明する情報を補足します。マイクロソフト サポート技術。
107501 情報: Visual c の 32 ビットの _ _declspec 代替 __export
利点とを使用のを説明します。_declspec(dllimport) と _declspec(dllexport) のアプリケーションにします。

詳細

_Declspec(dllimport) は、32 ビット版の Visual C を使用し、以前に使用して、__export のキーワードを置換する _declspec(dllexport)16 ビット バージョンの Visual C します。

_Declspec(dllimport)、コードのコンパイルに使用する必要はありません。正しくが、その場合はより良いコードを生成するためできます。は、コンパイラは、確実に知っているためにより良いコードを生成できるかどうか関数が DLL 内が存在するか、コンパイラで生成できるため、コード通常は関数内に存在する間接操作のレベルをスキップします。DLL の境界を越える呼び出しします。

正しい。DEF ファイルの EXPORTS セクション、_declspec(dllexport) ではありません。必要です。エクスポートする簡単な方法を提供する _declspec(dllexport) が追加されました機能をします。EXE または。DLL を使用せずに。DEF ファイルです。

この資料の残りの部分は、かなり低レベルが用意されています詳細これらの問題について説明します。

Win32 のポータブル実行可能形式の数を最小限に抑えるように設計されていますページのインポートを修正するために接触する必要があります。これを行うには、すべて配置、任意のプログラムでは、インポート アドレスと呼ばれる 1 つの場所のアドレスをインポートします。テーブルです。これは、ローダーのみ 1 または 2 に変更することができますページの場合これらのインポートにアクセスします。

_Declspec(dllimport) 関数を呼び出す場合に使用

次のコード例では、func1 が関数であると想定します。DLL が別のものにします。EXE ファイルの main() 関数を記述します。

_Declspec(dllimport) には、次のコードのとおりです。
void main(void) {
    func1();
}
				
コンパイラには、次のようなコードが生成されます。
call func1
				
リンカーを呼び出しには、次のように変換されます。
call 0x4000000         ; The address of 'func1'.
				
'Func1' を別の DLL に存在する場合、リンカーは、この直接解決できません。'func1' のアドレスを知る方法があるないためです。16 ビット環境リンカー追加このコードのアドレス一覧には。EXEローダーの正しいアドレスを実行時にパッチします。32 ビット環境では、リンカーは確認するサンクを生成、アドレスです。サンクは次のとおりです。
   0x40000000:    jmp DWORD PTR __imp_func1
				
__Imp_func1、func1 のスロットには、インポート アドレスのアドレスです。目次にします。EXE ファイルです。すべてのアドレスは、したがって、リンカーに認識されます。は、ローダーをのみが更新をします。EXE ファイルのインポート アドレス テーブルな読み込み時にすべてが正常に動作します。

お勧めするためそのため、_declspec(dllimport) を使用してお勧めする場合、必要はない場合は、リンカーがサンクを生成しません。サンクを作成する、大規模なコード (RISC システム上では、いくつかの方法が可能) とすることができますキャッシュのパフォーマンスが低下します。ようにコンパイラに指示する場合に、関数でください。DLL は、間接呼び出しを生成できます。

ではこのコード:
__declspec(dllimport) void func1(void);

void main(void) {
    func1();
}
				
この命令が生成されます。
call DWORD PTR __imp_func1
				
コードが小さくなるのではないサンクおよび jmp 命令はないと高速化します。

その一方で、DLL 内部で関数を呼び出す場合がしません。間接呼び出しを使用します。関数のアドレスがわかっています。時間とスペースの必要をロードする前に、関数のアドレスを格納している、直接の呼び出しは、常に高速コンパクトですので間接呼び出しをします。だけにします。__declspec(dllimport) 外部から DLL 関数を呼び出すときに使用するのにはDLL 自体。__Declspec(dllimport) は、DLL 内の関数を使用しません。その DLL をビルドするとします。

_Declspec(dllexport) を使用します。

導入された Microsoft __export、16 ビット コンパイラのバージョンを許可するにはエクスポート名を自動的に生成およびそれらに配置するコンパイラは、.LIB ファイルです。これ。LIB ファイルは、固定のようなだけで使用できます。リソース ライブラリします。DLL をリンクします。

マイクロソフトは、この便利な機能を続行するのには、__declspec(dllexport) を追加しました。その目的は、必要があるため、オブジェクト ファイルにエクスポート ディレクティブを追加することa.DEF ファイルです。

C++ の装飾をエクスポートしようとした場合この利便性が明らかになります関数の名前です。標準仕様がない名前の装飾のためエクスポート関数の名前は、コンパイラのバージョン間で変更できます。If_declspec(dllexport) を使用するには、依存 DLL を再コンパイルします。EXE ファイル名前付け規約の変更については、アカウントにのみ必要があります。

序数、NONAME、またはプライベートで行うことができますなど、多くのエクスポート ディレクティブだけでは。DEF ファイル、およびこれらの属性を指定する方法はありません。なしをします。DEF ファイルです。ただしの他に _declspec(dllexport) を使用してください。使用して、します。DEF ファイルのビルド エラーは発生しません。

参照として、Win32 の WINBASE を参照してください。H ヘッダー ファイルです。それに含まれる優先の __declspec(dllexport) と __declspec(dllimport) の例使用します。

上のデータは、_declspec(dllexport) と _declspec(dllimport) を使用してください。

データの場合は、_declspec(dllimport) を使用して、便利なアイテムです。レイヤーの間接参照を削除します。DLL からは、まだデータをインポートするときインポート アドレス テーブルを表示するがします。前に Win32 の日に_declspec(dllimport)、このレベルを実行する必要がある必要があるありましたデータにアクセスするときを間接的には、DLL からエクスポートされました。
// project.h
#ifdef _DLL     // If accessing the data from inside the DLL
   ULONG ulDataInDll;

else            // If accessing the data from outside the DLL
   ULONG *ulDataInDll;
#endif
				
後のデータがエクスポートされることを。DEF ファイル:
// project.def
LIBRARY project
EXPORTS
    ulDataInDll   CONSTANT
				
DLL の外部アクセスします。
if (*ulDataInDll == 0L) {
   // Do stuff here
}
				
場合、データ __declspec(dllimport)、コンパイラとして自動的にマーク間接参照コードを生成します。心配する必要はないです。上記の手順します。前に述べたように、_declspec(dllimport) は使用しないでください。データは、DLL のビルド時に宣言します。DLL 内の関数インポート アドレス テーブルは、データ オブジェクトにアクセスするのには使用しません。そのため、余分なレベルの間接は使用できません。

DLL からデータを自動的にエクスポートするには、この宣言を使用します。
__declspec(dllexport) ULONG ulDataInDLL;
				

使用して、します。DEF ファイル

__Declspec(dllimport) と共に使用することを選択した場合は、します。DEF ファイルを使用変更する必要がありますは。定数の代わりにデータを使用して削減する DEF ファイル、可能性不適切なコーディングに問題が発生します。
// project.def
LIBRARY project
EXPORTS
    ulDataInDll   DATA
				
次の表では、その理由を示しています。
Keyword     Emits in the import lib     Exports
CONSTANT    __imp_ulDataInDll           ulDataInDll
            __ulDataInDll

DATA        __imp_ulDataInDll           ulDataInDll
				
_Declspec (dllimport) と定数を使用して、__imp_ バージョンの両方の一覧が表示されます、修飾されていない名前には。作成するライブラリ DLL のインポート ライブラリ明示的なリンクを許可します。_Declspec(dllimport) とデータを使用して表示されますだけで、__imp_ のバージョンの名前です。

定数を使用すると、次のコード コンス トラクターのいずれか使用できます。ulDataInDll にアクセスします。
__declspec(dllimport) ULONG ulDataInDll; /*prototype*/ 
   if (ulDataInDll == 0L)   /*sample code fragment*/ 
				
- または -
ULONG *ulDataInDll;      /*prototype*/ 
if (*ulDataInDll == 0L)  /*sample code fragment*/ 
				
ただし、データを使用すると、します。コードのみ DEF ファイルをコンパイルするのには次の定義、変数 ulDataInDll にアクセスできます。
__declspec(dllimport) ULONG ulDataInDll;
if (ulDataInDll == 0L)   /*sample code fragment*/ 
				
定数の使用されるリスクが高くなりますので、余分なレベルを使用することを忘れた場合間接のインポート アドレス テーブルの可能性がありますアクセスできませんでした。: 変数自体ではなく、変数へのポインター。この種の問題多くの場合、アクセス違反が原因としてためにマニフェストできますインポート アドレス テーブル現在、Microsoft のコンパイラとリンカーが読み取り専用で行われます。

定数を参照する場合は、現在の Visual C リンカー警告を発行しますします。DEF ファイルを使用してこのケースを考慮します。使用する唯一の理由定数は、オブジェクト ファイルを再コンパイルできないかどうかは、ヘッダー ファイルプロトタイプに dllimport を一覧表示していません。

関連情報

ビジュアル C++ 書籍オンラインは、大量のドキュメントを提供します。dllexport と dllimport のストレージ クラス属性をします。これが含まれます。「Dllexport と dllimport 属性」と"dllimport を使用し、C++ での dllexport」の各トピックでは、この章の「Microsoft 固有の修飾子」C++ 言語のリファレンス、および「シンボルのエクスポート」のトピックでは、「Win32 の Dll を作成する」の章のプログラミング手法の参照。完全な一覧については"関連項目"を検索、Books Online"dllimport"または"dllexport"。

詳細については、microsoft の次の資料を参照してください。ナレッジ ベース:
90530 DLL やアプリケーションからデータをエクスポートするには、方法
107501 情報: Visual c の 32 ビットの _ _declspec 代替 __export

プロパティ

文書番号: 132044 - 最終更新日: 2011年7月1日 - リビジョン: 4.0
キーワード:?
kbinfo kbcode kbcompiler kbmt KB132044 KbMtja
機械翻訳の免責
重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。
英語版 KB:132044
Microsoft Knowledge Base の免責: Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。
サポート期間が終了した「サポート技術情報」資料に関する免責事項
この資料は、マイクロソフトでサポートされていない製品について記述したものです。そのため、この資料は現状ベースで提供されており、今後更新されることはありません。

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com