質問: ### DLLを作成できるようになりたい。 使用環境は、VisualStudio2015 Windows10 です。 DLLについての知識がないため、作成できるようになりたいのですが、Microsoft Developer Network チュートリアルの内容に不明な個所があるため、その部分を教えて頂きたいです。 チュートリアル: ダイナミック リンク ライブラリの作成と使用 (C++) このページに以下のようなヘッダーファールを作成するとあります。 ここで、#ifdef MATHFUNCSDLL_EXPORTSとありますが、これを定義するのはどの場所なのでしょうか? プログラムは一応動かしてみて問題なく動作したのですが、どこでこのMATHFUNCSDLL_EXPORTSが定義されるのかがいまいちよくわかりません。 また、「この例では、MATHFUNCSDLL_EXPORTS は MathFuncsDll プロジェクトのビルド時に定義されます。 詳細については、「dllexport、dllimport」を参照してください。」と書いてあるのですが、該当ページを見てみたものの、良くわかりません。 どなたか、分かりやすく教えて頂ける方お願いします。 ### 該当のソースコード ``` // MathFuncsDll.h #ifdef MATHFUNCSDLL_EXPORTS #define MATHFUNCSDLL_API __declspec(dllexport) #else #define MATHFUNCSDLL_API __declspec(dllimport) #endif ```
回答: こんにちは。 ダイナミック・リンク・ライブラリをビルドする際、dllを使う側から関数等を呼び出せるようにするため、関数名等をexportする必要かあります。 また、dllを使う側は、それらの関数名等をimportする必要が有ります。 `__declspec(dllexport)`は関数名等につけることでそれをexportします。 `__declspec(dllimport)`は同じく関数名等につけることでそれをimportします。 そして、これらをヘッダ・ファイルで宣言している関数名等につけることが一般的です。 その際に、dllをビルドする時には`__declspec(dllexport)`をつけ、dllを使う時には`__declspec(dllimport)`を付けるように切り替えれば、同じヘッダ・ファイルを使いまわせて便利です。 その切替のためのシンボルがMATHFUNCSDLL_EXPORTSです。 MATHFUNCSDLL_EXPORTSが定義されていればMATHFUNCSDLL_API は`__declspec(dllexport)`になり、そうでなければ`__declspec(dllimport)`になりますので、MATHFUNCSDLL_APIを各関数名等につけておけば良いわけです。 従って、MATHFUNCSDLL_EXPORTSはdllをビルドする時だけ定義します。 恐らく、MathFuncsDllプロジェクトのプロパティのC/C++→プリプロセッサの「プリプロセッサの定義」あたりでMATHFUNCSDLL_EXPORTSが定義されているのだろうと思います。