__declspec(dllexport) を使った DLL からのエクスポート

更新 : 2007 年 11 月

Microsoft は、Visual C++ の 16 ビット版のコンパイラに __export を導入しました。この機能を使うと、エクスポート名が自動的に生成され、.lib ファイル内に配置されます。この .lib ファイルは、DLL とリンクするスタティック ライブラリと同じように使用できます。

新しいバージョンのコンパイラでは、__declspec(dllexport) キーワードを使うと、データ、関数、クラス、クラスのメンバ関数を DLL からエクスポートできます。__declspec(dllexport) は、オブジェクト ファイルにエクスポート ディレクティブを追加するので、.def ファイルは不要です。

この機能は、C++ 関数の装飾名をエクスポートする場合に特に便利です。名前の装飾には標準仕様がないので、エクスポート関数の名前は、コンパイラのバージョン間で変わる場合があります。__declspec(dllexport) を使用する場合は、名前付け規約の変更に対応するためだけに、DLL とその従属する .exe ファイルを再コンパイルする必要があります。

序数、NONAME、PRIVATE など、多くのエクスポート ディレクティブは、.def ファイル内にしか作成されないので、これらの属性を .def ファイルを使用せずに指定することはできません。ただし、.def ファイルに加えて __declspec(dllexport) を使うと、ビルド エラーが発生しません。

関数をエクスポートするには、呼び出し規約キーワードが指定されている場合、__declspec(dllexport) キーワードは呼び出し規約キーワードの左に記述します。たとえば、次のようにします。

__declspec(dllexport) void __cdecl Function1(void);

クラス内のすべてのパブリック データ メンバおよびメンバ関数をエクスポートするには、__declspec(dllexport) キーワードは、以下のようにクラス名の左に記述します。

class __declspec(dllexport) CExampleExport : public CObject
{ ... class definition ... };

DLL のビルド時には通常、エクスポートする関数のプロトタイプやクラスを含むヘッダー ファイルを作成し、そのヘッダー ファイル内の宣言に __declspec(dllexport) を追加します。コードを読みやすくするために、次のように __declspec(dllexport) 用のマクロを定義して、そのマクロをエクスポートする各シンボルに使います。

#define DllExport   __declspec( dllexport ) 

__declspec(dllexport) は、関数名を DLL のエクスポート テーブルに格納します。テーブル サイズの最適化方法については、「名前ではなく序数値による DLL 関数のエクスポート」を参照してください。

a90k134d.alert_note(ja-jp,VS.90).gifメモ :

DLL のソース コードを Win16 から Win32 に移植する場合は、__export の各インスタンスを __declspec(dllexport) に置き換えます。

参考として、Win32 の Winbase.h ヘッダー ファイルを検索してください。__declspec(dllimport) の使用例があります。

目的に合ったトピックをクリックしてください

さらに詳しくは次のトピックをクリックしてください

参照

概念

DLL からのエクスポート