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

ナビゲーションに移動 検索に移動
82行目: 82行目:
<br>
<br>


==== defファイルを使用しない ====
==== モジュール定義ファイル (.def) を使用しない場合 ====
defファイルを作成しない方法を記載する。<br>
モジュール定義ファイルを使用しない場合は、<code>extern "C"</code>キーワードおよび<code>__declspec(dllexport)</code>キーワードを付加する必要がある。<br>
<br>
<br>
Visual Studioの[プロジェクト][プロパティ]を選択する。<br>
C言語では同じ関数名を複数定義できないため、関数名の一意性があるが、C++では関数のオーバーロードができるため、同じ関数名を区別するためにDLLの出力時に関数名が自動的に変更される。<br>
[C++][プリプロセッサの定義]に"DLL"プリプロセッサを追加する。(“Stdafx.h”ファイルに”DLL”プリプロセッサを記載してもよい)<br>
エクスポートする関数名の一意に決定するため、<code>extern "C"</code>キーワードを付加することにより、DLLの出力時に特定の関数名を変更しないようにする。<br>
<br>
Visual Studioの[プロジェクト] - [プロパティ]を選択する。<br>
[C++] - [プリプロセッサの定義]に"DLL"プリプロセッサを追加する。(“Stdafx.h”ファイルに”DLL”プリプロセッサを記載してもよい)<br>
<br>
<br>
まず、"MainDLL.h"ファイルの先頭に以下のソースコードを追加する。<br>
まず、"MainDLL.h"ファイルの先頭に以下のソースコードを追加する。<br>
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
  MainDLL.h // ファイルの先頭に以下を追加する。
  // MainDLL.h
   
   
  #ifndef __MAINDLL_H__
  #ifndef __MAINDLL_H__
108行目: 111行目:
次に、上記の"MainDLL.h"ファイルにエクスポートしたい関数を以下のように記載する。<br>
次に、上記の"MainDLL.h"ファイルにエクスポートしたい関数を以下のように記載する。<br>
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
  MainDLL.h
  // MainDLL.h
   
   
  #ifdef __cplusplus
  #ifdef __cplusplus
115行目: 118行目:
  #endif
  #endif
   
   
  DLL_EXPORT int WINAPI SampleFunc(CString &p_rcStr, CWnd *p_pcWnd);
  DLL_EXPORT int SampleFunc(CString &p_rcStr, CWnd *p_pcWnd);
   
   
  #ifdef __cplusplus
  #ifdef __cplusplus
124行目: 127行目:
"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"
</syntaxhighlight>
 
<br>
  extern "C" int SampleFunc(CString &p_rcStr, CWnd *p_pcWnd)
"MainDLL.cpp"ファイルにて関数を作成する時は、以下のように記載する。<br>
<syntaxhighlight lang="c++">
MainDLL.cpp
  extern "C" int WINAPI SampleFunc(CString &p_rcStr, CWnd *p_pcWnd)
  {
  {
     // 以下略
     // 以下略
  }
  }
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<code>extern "C"</code>キーワードを付加しない場合、他の実行ファイル等からDLLを使用すると、関数が見つからないとエラーが発生する。<br>
ネイティブの実行ファイルから呼び出す場合、コンパイル時にエラーが発生する場合が多い。<br>
ただし、マネージドの実行ファイルからC++ DLLを呼び出す場合、<u>実行時に</u>例外<code>System.EntryPointNotFoundException</code>が発生する。<br>
<br><br>
<br><br>


案内メニュー