「ライブラリの基礎 - DLLの作成(C/C++/MFC)」の版間の差分
(ページの作成:「== 概要 == MFCを使ったDLLには、以下の2つの種類がある。<br> # 1つ目は"拡張DLL"で、DLLを使用するEXEやDLLもMFCで作成する時にのみ…」) |
編集の要約なし |
||
5行目: | 5行目: | ||
<br><br> | <br><br> | ||
== DLLの作成方法 == | == DLLの作成方法(defファイルを作成しない方法) == | ||
defファイルを作成しない方法を記載する。<br> | |||
<br> | |||
Visual Studioの[プロジェクト]→[プロパティ]を選択する。<br> | Visual Studioの[プロジェクト]→[プロパティ]を選択する。<br> | ||
[C++]→[プリプロセッサの定義]に"DLL"プリプロセッサを追加する。(“Stdafx.h”ファイルに”DLL”プリプロセッサを記載してもよい)<br> | [C++]→[プリプロセッサの定義]に"DLL"プリプロセッサを追加する。(“Stdafx.h”ファイルに”DLL”プリプロセッサを記載してもよい)<br> | ||
62行目: | 63行目: | ||
</source> | </source> | ||
<br><br> | <br><br> | ||
== DLLの作成方法(defファイルを作成する) == | |||
defファイルを作成する方法を記載する。<br> | |||
<br> | |||
defファイルを作成しない方法では、DLLの関数をエクスポートするために"__declspec"キーワードを使用したが、関数のエクスポートは"defファイル"を利用することでも可能である。 | |||
"defファイル"によるエクスポートを採用した場合、 エクスポート関数名にキーワードを付ける必要は無い。 | |||
<br> | |||
'''※ C#等で作成したEXEまたはDLLからMFC DLLを呼び出す場合、MFC DLLでは”defファイル”を使用すること''' | |||
'''※ defファイルとは、DLLがエクスポートする関数を記述したファイルのことである。''' | |||
''' [追加]→[新しい項目]を押下して、[新しい項目の追加]ダイアログにて”xxx.def”を追加するとdefファイルが作成される。''' | |||
[プロジェクト]メニューの[プロパティ]を押下して、プロパティダイアログを表示する。 | |||
プロパティダイアログの[リンカー]→[入力]の[モジュール定義ファイル]に使用するdefファイルの名前を記述する。 | |||
[[ファイル:MFC DLL 01.png|フレームなし|中央]] | |||
<br> | |||
defファイルを作成して、以下のようにエクスポートしたい関数を記載する。 | |||
※但し、"@1"等の序数値は記載しなくてもよい | |||
---defファイル(ここから)--- | |||
LIBRARY MainDLL | |||
EXPORTS | |||
SampleFunc @1 | |||
TestFunc @2 | |||
---defファイル(ここまで)--- | |||
次に、"MainDLL.h"ファイルは以下のように記載する | |||
---ヘッダファイル(ここから)--- | |||
#pragma once | |||
#ifndef _USRDLL | |||
#define DLL_EXPORT extern "C" __declspec(dllimport) | |||
#else | |||
#define DLL_EXPORT | |||
#endif | |||
DLL_EXPORT int __stdcall SampleFunc(int *lp1, int *lp2); | |||
DLL_EXPORT double __stdcall TestFunc(double *lp1, double *lp2); | |||
---ヘッダファイル(ここまで)--- | |||
最後に、"MainDLL.cpp"ファイルには以下のように記載する | |||
---cppファイル(ここから)--- | |||
#include “Stdafx.h” | |||
#include "MainDLL.h" | |||
int __stdcall SampleFunc(int *lp1, int *lp2) | |||
{ | |||
// 以下略 | |||
} | |||
int __stdcall TestFunc(double *lp1, double *lp2) | |||
{ | |||
// 以下略 | |||
} | |||
---cppファイル(ここまで)--- | |||
__FORCETOC__ | __FORCETOC__ | ||
[[カテゴリ:MFC]] | [[カテゴリ:MFC]] |
2019年10月24日 (木) 22:32時点における版
概要
MFCを使ったDLLには、以下の2つの種類がある。
- 1つ目は"拡張DLL"で、DLLを使用するEXEやDLLもMFCで作成する時にのみ使うことができる。
- 2つ目は"MFCの共有DLLを使用"(Regular DLL)で、これは内部的にMFCそのものを持っているため、DLLを使用するEXEやDLLをMFCで作成しなくても使用できる。
DLLの作成方法(defファイルを作成しない方法)
defファイルを作成しない方法を記載する。
Visual Studioの[プロジェクト]→[プロパティ]を選択する。
[C++]→[プリプロセッサの定義]に"DLL"プリプロセッサを追加する。(“Stdafx.h”ファイルに”DLL”プリプロセッサを記載してもよい)
まず、"MainDLL.h"ファイルの先頭に以下のソースコードを追加する。
MainDLL.h // ファイルの先頭に以下を追加する。
#ifndef __MAINDLL_H__
#define __MAINDLL_H__
#ifdef DLL
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT __declspec(dllimport)
#endif
// 以下略
#endif //__MAINDLL_H__
次に、上記の"MainDLL.h"ファイルにエクスポートしたい関数を以下のように記載する。
MainDLL.h
#ifdef __cplusplus
extern "C"
{
#endif
DLL_EXPORT int WINAPI SampleFunc(CString &p_rcStr, CWnd *p_pcWnd);
#ifdef __cplusplus
}
#endif
"MainDLL.cpp"ファイルの先頭に以下を記載する。
MainDLL.cpp
#include "StdAfx.h"
#include "MainDLL.h"
"MainDLL.cpp"ファイルにて関数を作成する時は、以下のように記載する。
MainDLL.cpp
extern "C" int WINAPI SampleFunc(CString &p_rcStr, CWnd *p_pcWnd)
{
// 以下略
}
DLLの作成方法(defファイルを作成する)
defファイルを作成する方法を記載する。
defファイルを作成しない方法では、DLLの関数をエクスポートするために"__declspec"キーワードを使用したが、関数のエクスポートは"defファイル"を利用することでも可能である。
"defファイル"によるエクスポートを採用した場合、 エクスポート関数名にキーワードを付ける必要は無い。
※ C#等で作成したEXEまたはDLLからMFC DLLを呼び出す場合、MFC DLLでは”defファイル”を使用すること
※ defファイルとは、DLLがエクスポートする関数を記述したファイルのことである。
[追加]→[新しい項目]を押下して、[新しい項目の追加]ダイアログにて”xxx.def”を追加するとdefファイルが作成される。
[プロジェクト]メニューの[プロパティ]を押下して、プロパティダイアログを表示する。 プロパティダイアログの[リンカー]→[入力]の[モジュール定義ファイル]に使用するdefファイルの名前を記述する。
defファイルを作成して、以下のようにエクスポートしたい関数を記載する。
※但し、"@1"等の序数値は記載しなくてもよい
---defファイル(ここから)--- LIBRARY MainDLL
EXPORTS SampleFunc @1 TestFunc @2 ---defファイル(ここまで)---
次に、"MainDLL.h"ファイルは以下のように記載する
---ヘッダファイル(ここから)---
- pragma once
- ifndef _USRDLL
- define DLL_EXPORT extern "C" __declspec(dllimport)
- else
- define DLL_EXPORT
- endif
DLL_EXPORT int __stdcall SampleFunc(int *lp1, int *lp2); DLL_EXPORT double __stdcall TestFunc(double *lp1, double *lp2); ---ヘッダファイル(ここまで)---
最後に、"MainDLL.cpp"ファイルには以下のように記載する
---cppファイル(ここから)---
- include “Stdafx.h”
- include "MainDLL.h"
int __stdcall SampleFunc(int *lp1, int *lp2) { // 以下略 }
int __stdcall TestFunc(double *lp1, double *lp2) { // 以下略 } ---cppファイル(ここまで)---