13,002
回編集
82行目: | 82行目: | ||
<br> | <br> | ||
==== | ==== モジュール定義ファイル (.def) を使用しない場合 ==== | ||
モジュール定義ファイルを使用しない場合は、<code>extern "C"</code>キーワードおよび<code>__declspec(dllexport)</code>キーワードを付加する必要がある。<br> | |||
<br> | <br> | ||
Visual Studioの[プロジェクト] | C言語では同じ関数名を複数定義できないため、関数名の一意性があるが、C++では関数のオーバーロードができるため、同じ関数名を区別するためにDLLの出力時に関数名が自動的に変更される。<br> | ||
[C++] | エクスポートする関数名の一意に決定するため、<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 | 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" | ||
extern "C" int SampleFunc(CString &p_rcStr, CWnd *p_pcWnd) | |||
extern "C" int | |||
{ | { | ||
// 以下略 | // 以下略 | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<br> | |||
<code>extern "C"</code>キーワードを付加しない場合、他の実行ファイル等からDLLを使用すると、関数が見つからないとエラーが発生する。<br> | |||
ネイティブの実行ファイルから呼び出す場合、コンパイル時にエラーが発生する場合が多い。<br> | |||
ただし、マネージドの実行ファイルからC++ DLLを呼び出す場合、<u>実行時に</u>例外<code>System.EntryPointNotFoundException</code>が発生する。<br> | |||
<br><br> | <br><br> | ||