「ライブラリの基礎 - DLLの作成(C/C++/MFC)」の版間の差分

ナビゲーションに移動 検索に移動
13行目: 13行目:
[プロパティ]ダイアログの右ペインから、[呼び出し規約]プルダウンを<u>__cdecl (/Gd)</u>に変更する。 (デフォルト)<br>
[プロパティ]ダイアログの右ペインから、[呼び出し規約]プルダウンを<u>__cdecl (/Gd)</u>に変更する。 (デフォルト)<br>
<br>
<br>
==== defファイルを使用する ====
==== モジュール定義ファイル (defファイル) を使用する場合 ====
defファイルを作成する方法を記載する。<br>
モジュール定義 (.def拡張子) ファイルは、DLLがエクスポートする関数を記述したファイルであり、リンクするプログラムに関するエクスポート、属性、その他の情報をリンカに提供する。<br>
モジュール定義ファイルは、DLLをビルドする場合に最も役立つ。<br>
<br>
<br>
defファイルとは、DLLがエクスポートする関数を記述したファイルのことである。<br>
モジュール定義ステートメントの代わりに使用できるMSVCリンカオプションがあるため、モジュール定義ファイルが存在してくてもDLLを開発することができる。<br>
[ソリューションエクスプローラ]を右クリック - [追加] - [新しい項目]を選択して、[新しい項目の追加]ダイアログにて"<ファイル名>.def"を追加すると、defファイルが作成される。<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>
[プロパティ]ダイアログの[リンカー] - [入力] - [モジュール定義ファイル]項目に使用するdefファイル名を記述する。<br>
[プロパティ]ダイアログの[リンカー] - [入力] - [モジュール定義ファイル]項目に使用するモジュール定義ファイル名を入力する。<br>
[OK]ボタン、または、[適用]ボタンを押下して、変更内容を保存する。<br>
<br>
[[ファイル:MFC DLL 01.png|フレームなし|中央]]
[[ファイル:MFC DLL 01.png|フレームなし|中央]]
<br>
<br>
<u>※注意</u><br>
<u>※注意</u><br>
<u>C#にて作成したモジュール(EXEまたはDLL)からC++ DLLを呼び出す場合、C++ DLLではdefファイルを使用すること。</u><br>
<u>C#で開発したモジュール(EXEまたはDLL)からC++ DLLを呼び出す場合、C++ DLLではモジュール定義ファイルを使用すること。</u><br>
<br>
<br>
defファイルを作成して、以下のようにエクスポートする関数を記載する。<br>
モジュール定義ファイルを作成して、以下に示すようにエクスポートする関数を記述する。<br>
'''※但し、"@1"等の序数値は記載しなくてもよい'''。<br>
また、<u>@1</u>等の序数値の記載は任意である。<br>
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="ini">
  MainDLL.def
  ; MainDLL.def
  LIBRARY MainDLL
  LIBRARY MainDLL
   
   
39行目: 50行目:
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br>
次に、"MainDLL.h"ファイルは以下のように記載する。<br>
次に、"MainDLL.h"ファイルを作成する。<br>
defファイルによるエクスポートを採用した場合、 エクスポート関数名にキーワードを付ける必要は無い。<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
   
   
  #ifndef  _USRDLL
  int   SampleFunc(int *lp1, int *lp2);
#define  DLL_EXPORT  extern "C" __declspec(dllimport)
  double TestFunc(double *lp1, double *lp2);
#else
#define  DLL_EXPORT
#endif
DLL_EXPORT int     __stdcall SampleFunc(int *lp1, int *lp2);
  DLL_EXPORT double   __stdcall 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 __stdcall SampleFunc(int *lp1, int *lp2)
  int SampleFunc(int *lp1, int *lp2)
  {
  {
     // 以下略
     // ...処理 1
  }
  }
   
   
  int __stdcall TestFunc(double *lp1, double *lp2)
  int TestFunc(double *lp1, double *lp2)
  {
  {
     // 以下略
     // ...処理 2
  }
  }
  </syntaxhighlight>
  </syntaxhighlight>

案内メニュー