__declspec(dllimport)と_declspec(dllexport)

1657 ワード

__declspec(dllimport)と_declspec(dllexport)
dllのエクスポート関数をリンクする場合は、ヘッダファイルとlib,_を含めるだけです.declspec(dllimport)修飾子は必須ではありませんが、この修飾を加えると、エクスポート関数の呼び出し効率が向上します.理由は次のとおりです.__を使用しないためです.declspec(dllimport)もコードを正しくコンパイルできますが、__を使用します.declspec(import)は、コンパイラがより良いコードを生成できるようにします.コンパイラがより良いコードを生成できるのは、関数がDLLに存在するかどうかを決定できるためであり、コンパイラは間接アドレスレベルをスキップしたコードを生成することができ、これらのコードは通常、DLL境界にまたがる関数呼び出しに現れる.ただし、__を使用する必要がありますDLLで使用される変数をインポートするにはdeclspec(dllimport)を使用します.dllが関数をエクスポートしたと仮定します:extern"C"_declspec(dllexport) void fun(); 一、プログラム中に__を付けないと宣言した場合declspec(dllimport)、fun()関数を呼び出すアセンブリコードを表示する:004010 AD call fun(004010 d 8)funは、funが符号(label)として定義され、fun:004010 D 8 jmp dword ptr[_imp__fun(0040 e 0 e 8)]の上の適合_imp__funは、アドレスがfun関数のexeのインポートセクションを指します.だまされた声明に__を加えるdeclspec(dllimport)後、fun()関数を呼び出すアセンブリコード:004010 AD call dwor ptr[_imp_fun(0040 e 0 e 8)]を表示します.declspec(dllimport)、コンパイラはdllをリンクしてjmp文を省略します.これは:1.エクスポート関数の宣言が使用されなかった場合declspec(dllimport)修飾では,コンパイラはこの関数がDLLから導出されたことを知らないため,コンパイラはこの関数を通常の外部参照として扱い,外部参照の記号を生成してリンク解析を待つ.リンクが動作すると、コンパイラが生成した結果を変更できないため、シンボルは対応する関数のセクションへの間接呼び出しとして解析されます.2.関数の宣言呼び出しをエクスポートした場合declspec(dllimport)修飾では,コンパイラは最初からこの関数がDLL導出関数であることを知り,呼び出し節の呼び出しに直接コンパイルした.
普通hファイルには以下のように書かれています.
SimpleDllClass.h
#ifdef SIMPLEDLL_EXPORT
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT __declspec(dllimport)

これによりDLLライブラリで実現可能なファイルにEXPORTは、呼び出されたファイルにマクロを定義する必要はありません.これを含めてh,classの前にDLL_を付けるEXPORTは、異なる意味を表す、非常に秒の書き方です.