13,039
回編集
| 13行目: | 13行目: | ||
[プロパティ]ダイアログの右ペインから、[呼び出し規約]プルダウンを<u>__cdecl (/Gd)</u>に変更する。 (デフォルト)<br> | [プロパティ]ダイアログの右ペインから、[呼び出し規約]プルダウンを<u>__cdecl (/Gd)</u>に変更する。 (デフォルト)<br> | ||
<br> | <br> | ||
==== | ==== モジュール定義ファイル (defファイル) を使用する場合 ==== | ||
モジュール定義 (.def拡張子) ファイルは、DLLがエクスポートする関数を記述したファイルであり、リンクするプログラムに関するエクスポート、属性、その他の情報をリンカに提供する。<br> | |||
モジュール定義ファイルは、DLLをビルドする場合に最も役立つ。<br> | |||
<br> | <br> | ||
モジュール定義ステートメントの代わりに使用できるMSVCリンカオプションがあるため、モジュール定義ファイルが存在してくてもDLLを開発することができる。<br> | |||
[ソリューションエクスプローラ] | モジュール定義ファイルを使用しない場合は、エクスポートされる関数を指定する方法として、<code>__declspec(dllexport)</code>を使用する。<br> | ||
<br> | |||
<u>※注意</u><br> | |||
<u>エクスポートを行わない実行ファイルを開発する場合、モジュール定義ファイルを使用すると、出力ファイルのサイズが大きくなり読み込みが遅くなることに注意する。</u><br> | |||
<br> | |||
[ソリューションエクスプローラ]を右クリックして、コンテキストメニューから[追加] - [新しい項目]を選択する。<br> | |||
[新しい項目の追加]ダイアログが開くので、モジュール定義ファイル名 <u><ファイル名>.def</u> を入力する。<br> | |||
[OK]ボタンを押下すると、モジュール定義ファイルが自動的に作成される。<br> | |||
<br> | <br> | ||
<span style="color:#C00000"><u>※ C++でDLLを作成する場合は、defファイルを作成することを推奨する。</u></span><br> | <span style="color:#C00000"><u>※ C++でDLLを作成する場合は、defファイルを作成することを推奨する。</u></span><br> | ||
<br> | <br> | ||
[プロジェクト]メニューバー - [プロパティ]を選択して、[プロパティ]ダイアログを表示する。<br> | [プロジェクト]メニューバー - [プロパティ]を選択して、[プロパティ]ダイアログを表示する。<br> | ||
[プロパティ]ダイアログの[リンカー] - [入力] - [モジュール定義ファイル] | [プロパティ]ダイアログの[リンカー] - [入力] - [モジュール定義ファイル]項目に使用するモジュール定義ファイル名を入力する。<br> | ||
[OK]ボタン、または、[適用]ボタンを押下して、変更内容を保存する。<br> | |||
<br> | |||
[[ファイル:MFC DLL 01.png|フレームなし|中央]] | [[ファイル:MFC DLL 01.png|フレームなし|中央]] | ||
<br> | <br> | ||
<u>※注意</u><br> | <u>※注意</u><br> | ||
<u>C# | <u>C#で開発したモジュール(EXEまたはDLL)からC++ DLLを呼び出す場合、C++ DLLではモジュール定義ファイルを使用すること。</u><br> | ||
<br> | <br> | ||
モジュール定義ファイルを作成して、以下に示すようにエクスポートする関数を記述する。<br> | |||
また、<u>@1</u>等の序数値の記載は任意である。<br> | |||
<syntaxhighlight lang=" | <syntaxhighlight lang="ini"> | ||
MainDLL.def | ; MainDLL.def | ||
LIBRARY MainDLL | LIBRARY MainDLL | ||
| 39行目: | 50行目: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<br> | <br> | ||
次に、"MainDLL.h" | 次に、"MainDLL.h"ファイルを作成する。<br> | ||
モジュール定義ファイルを使用する場合、エクスポートする関数名に<code>extern "C"</code>キーワードおよび<code>DECLSPEC __declspec(dllexport)</code>キーワードを付加する必要はない。<br> | |||
<syntaxhighlight lang="c++"> | <syntaxhighlight lang="c++"> | ||
MainDLL.h | // MainDLL.h | ||
#pragma once | #pragma once | ||
int SampleFunc(int *lp1, int *lp2); | |||
double TestFunc(double *lp1, double *lp2); | |||
</syntaxhighlight> | </syntaxhighlight> | ||
<br> | <br> | ||
最後に、"MainDLL.cpp"ファイルには以下のように記載する。<br> | 最後に、"MainDLL.cpp"ファイルには以下のように記載する。<br> | ||
<syntaxhighlight lang="c++"> | <syntaxhighlight lang="c++"> | ||
MainDLL.cpp | // MainDLL.cpp | ||
#include "Stdafx.h" | #include "Stdafx.h" | ||
#include "MainDLL.h" | #include "MainDLL.h" | ||
int | int SampleFunc(int *lp1, int *lp2) | ||
{ | { | ||
// | // ...処理 1 | ||
} | } | ||
int | int TestFunc(double *lp1, double *lp2) | ||
{ | { | ||
// | // ...処理 2 | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||