用語 | 解説 |
dllエントリポイント | 下記の条件で呼び出される関数。
・dllがプロセスのアドレス空間に接続したとき(DLL_PROCESS_ATTACH) ・dllがプロセスのアドレス空間から切り離されたとき(DLL_PROCESS_DETACH) ・プロセスがスレッドを作ったとき(DLL_THREAD_ATTACH) ・スレッドが正常に終了したとき(DLL_THREAD_DETACH)
dllを作成する際は、明示的にエントリポイントを作る必要はありません。 エントリポイントが無い場合は、コンパイラが自動でエントリポイントを作成します。 (開発環境によっては作らないかも)
また、開発環境によってエントリポイントは違います。 VisualC++の場合・・・DLLMain BorlandC++Builderの場合・・・DLLEntryPoint |
インポートライブラリ | dllを作成すると、dllファイルの他にlibファイルもできます。 このlibファイルをインポートライブラリといいます。 インポートライブラリとインクルードファイルを、 開発プロジェクトに組込むと、 スタティックライブラリと同様の開発スタイルで良いため、 開発が簡単になります。 dllで外部に公開する関数は、 宣言の際「__declspec(dllexport)」をつける必要があります。 そして呼ぶ側は、「__declspec(dllimport)」をつける必要があります。
インポートライブラリを使用しない場合は、 ・LoadLibrary関数 ・GetProcAddress関数 ・FreeLibrary関数 を使用して開発する必要があります。
|
マングリング | C++のコンパイラは、関数名(メソッド名)に修飾文字をつけます。 リンカは修飾された関数名を使ってリンクします。 この、関数名を修飾することをマングリングといいます。 また、反対の動作をデマングリングといいます。
これは、オーバーロード(同名で引数が違う関数)があるため、 関数名だけでは対応できないためです。
マングリングアルゴリズムは、 それぞれのコンパイラによって違うため、 違うコンパイラが出力したオブジェクトファイルを利用する事はできません。
また、Cでコンパイルされたオブジェクトファイルは、 マングリングされていないので、 C++コンパイラからリンクする際は、 「extern
"C"」 と宣言しマングリングしないようにする必要があります。 |
呼び出し規約 | 関数を呼び出す際の規約もあります。 引数をスタックにいれるとか、レジスタに入れるとかです。 これを一緒にしなければ、おかしくなります。 基本的な規約は下記の通りです。 ・cdecl(Cでの規約で主にスタックを利用)
・thiscall(C++でのメンバ関数の規約) ・stdcall(Windows標準の関数規約でprintf等の可変引数は使えません。VB、C#もサポート)
・fastcall(高速な関数規約、BorlandC++Builderでは、主としてこれを使います。) ・clrcall(.NET Frameworkの専用規約)
|