次の方法で共有


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

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);

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

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

注意

__declspec(dllexport) は、__clrcall 呼び出し規約を伴う関数には適用できません。

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

#define DllExport   __declspec( dllexport ) 

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

注意

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

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

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

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

参照

概念

DLL からのエクスポート