13,002
回編集
編集の要約なし |
|||
25行目: | 25行目: | ||
defファイルを作成して、以下のようにエクスポートする関数を記載する。<br> | defファイルを作成して、以下のようにエクスポートする関数を記載する。<br> | ||
'''※但し、"@1"等の序数値は記載しなくてもよい'''。<br> | '''※但し、"@1"等の序数値は記載しなくてもよい'''。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
MainDLL.def | MainDLL.def | ||
LIBRARY MainDLL | LIBRARY MainDLL | ||
32行目: | 32行目: | ||
SampleFunc @1 | SampleFunc @1 | ||
TestFunc @2 | TestFunc @2 | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
次に、"MainDLL.h"ファイルは以下のように記載する。<br> | 次に、"MainDLL.h"ファイルは以下のように記載する。<br> | ||
defファイルによるエクスポートを採用した場合、 エクスポート関数名にキーワードを付ける必要は無い。<br> | defファイルによるエクスポートを採用した場合、 エクスポート関数名にキーワードを付ける必要は無い。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
MainDLL.h | MainDLL.h | ||
49行目: | 49行目: | ||
DLL_EXPORT int __stdcall SampleFunc(int *lp1, int *lp2); | DLL_EXPORT int __stdcall SampleFunc(int *lp1, int *lp2); | ||
DLL_EXPORT double __stdcall TestFunc(double *lp1, double *lp2); | DLL_EXPORT double __stdcall TestFunc(double *lp1, double *lp2); | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
最後に、"MainDLL.cpp"ファイルには以下のように記載する。<br> | 最後に、"MainDLL.cpp"ファイルには以下のように記載する。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
MainDLL.cpp | MainDLL.cpp | ||
67行目: | 67行目: | ||
// 以下略 | // 以下略 | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
==== defファイルを使用しない ==== | ==== defファイルを使用しない ==== | ||
76行目: | 76行目: | ||
<br> | <br> | ||
まず、"MainDLL.h"ファイルの先頭に以下のソースコードを追加する。<br> | まず、"MainDLL.h"ファイルの先頭に以下のソースコードを追加する。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
MainDLL.h // ファイルの先頭に以下を追加する。 | MainDLL.h // ファイルの先頭に以下を追加する。 | ||
91行目: | 91行目: | ||
#endif //__MAINDLL_H__ | #endif //__MAINDLL_H__ | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
次に、上記の"MainDLL.h"ファイルにエクスポートしたい関数を以下のように記載する。<br> | 次に、上記の"MainDLL.h"ファイルにエクスポートしたい関数を以下のように記載する。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
MainDLL.h | MainDLL.h | ||
107行目: | 107行目: | ||
} | } | ||
#endif | #endif | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
"MainDLL.cpp"ファイルの先頭に以下を記載する。<br> | "MainDLL.cpp"ファイルの先頭に以下を記載する。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
MainDLL.cpp | MainDLL.cpp | ||
#include "StdAfx.h" | #include "StdAfx.h" | ||
#include "MainDLL.h" | #include "MainDLL.h" | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
"MainDLL.cpp"ファイルにて関数を作成する時は、以下のように記載する。<br> | "MainDLL.cpp"ファイルにて関数を作成する時は、以下のように記載する。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
MainDLL.cpp | MainDLL.cpp | ||
125行目: | 125行目: | ||
// 以下略 | // 以下略 | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
236行目: | 236行目: | ||
DLLファイルを読み込むには、Windows APIでは<code>LoadLibrary</code>関数を使用する。<br> | DLLファイルを読み込むには、Windows APIでは<code>LoadLibrary</code>関数を使用する。<br> | ||
DLLファイルが見つからない場合は、ハンドルがNULLで返るため、エラーハンドリングを行う。<br> | DLLファイルが見つからない場合は、ハンドルがNULLで返るため、エラーハンドリングを行う。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
// DLLファイルの読み込み | // DLLファイルの読み込み | ||
HMODULE hModule = ::LoadLibrary(_T("Sample.dll")); | HMODULE hModule = ::LoadLibrary(_T("Sample.dll")); | ||
245行目: | 245行目: | ||
return 0; | return 0; | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
次に、DLLファイルから呼ぶ関数のアドレスを取得する。<br> | 次に、DLLファイルから呼ぶ関数のアドレスを取得する。<br> | ||
252行目: | 252行目: | ||
Hello関数のアドレスを取得するには、<code>GetProcAddress</code>関数を使用する。<br> | Hello関数のアドレスを取得するには、<code>GetProcAddress</code>関数を使用する。<br> | ||
Hello関数のアドレスの取得に失敗した場合は、必ず<code>FreeLibrary</code>関数を呼び、DLLファイルのハンドルを解放する。<br> | Hello関数のアドレスの取得に失敗した場合は、必ず<code>FreeLibrary</code>関数を呼び、DLLファイルのハンドルを解放する。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
typedef int (*FUNC)(char *); | typedef int (*FUNC)(char *); | ||
264行目: | 264行目: | ||
return 0; | return 0; | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
最後に、GetProcAddress関数で取得したHello関数のアドレスに引数を渡す。<br> | 最後に、GetProcAddress関数で取得したHello関数のアドレスに引数を渡す。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
// 関数の呼び出し | // 関数の呼び出し | ||
int ret = (*lpFunc)(tmp); | int ret = (*lpFunc)(tmp); | ||
277行目: | 277行目: | ||
return 0; | return 0; | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
以下に、サンプルコードの全体を示す。<br> | 以下に、サンプルコードの全体を示す。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
#include "stdafx.h" | #include "stdafx.h" | ||
#include <Windows.h> | #include <Windows.h> | ||
329行目: | 329行目: | ||
return 0; | return 0; | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br><br> | |||
== デバッグ方法 == | |||
C++DLLのデバッグ方法を、以下に記載する。<br> | |||
<br> | |||
# [ソリューションエクスプローラー]において、C++DLLプロジェクトを右クリックして、[プロパティ]を選択する。<br> | |||
# [<Project>プロパティページ]画面が開くので、画面上部の[構成]プルダウンから[デバッグ]を選択する。 | |||
# 次に、画面左にある[構成プロパティ] - [デバッグ]を選択する。 | |||
# 画面右にある[起動するデバッガー]プルダウンから[ローカルWindowsデバッガー]または[リモートWindowsデバッガー]のいずれかを選択する。 | |||
# 画面右にある[コマンド]項目または[リモートコマンド]項目において、呼び出し元の実行ファイルのフルパスを入力する。<br>コマンドライン引数が必要な場合、[コマンド引数]項目に任意の必要なコマンドライン引数を入力する。 | |||
# [OK]ボタンを押下する。 | |||
<br><br> | <br><br> | ||
__FORCETOC__ | __FORCETOC__ | ||
[[カテゴリ:C]][[カテゴリ:C++]][[カテゴリ:MFC]] | [[カテゴリ:C]][[カテゴリ:C++]][[カテゴリ:MFC]] |