|
DLL(Dynamic Link Library)は実行時にリンクされるライブラリ(プログラムの部品)です とりあえずコンソールを指定しておきます 「完了」を押さずに「次へ」を押してください ここでDLLを選択します DLLMain.cppです // DLLMain.cpp
#include <windows.h>
#include <tchar.h>
// DLLのエントリーポイント
// DLL読み込み時やDLL解放時に呼び出され
// DLLの初期化や後処理を行う
BOOL WINAPI DllMain(
HINSTANCE hinstDLL, // DLL モジュールのハンドル
DWORD fdwReason, // 関数を呼び出す理由
LPVOID lpvReserved // 予約済み
)
{
switch(fdwReason)
{
// このDLLの呼び出し元のアプリケーション(プロセス)が
// 動的な呼び出し、またLoadLibrary関数で
// このDLLを読み込んだときに行う処理(初期化に使う)
case DLL_PROCESS_ATTACH:
{
// 初期化処理
MessageBox(NULL,_T("DLL ロード"),NULL,MB_OK);
}
break;
// このDLLの呼び出し元のアプリケーション(プロセス)が
// 終了したあるいはそこからFreeLibrary関数が呼ばれたときに
// このDLLはアンロードされる
// アンロードされる前に行う処理(後処理に使う)
case DLL_PROCESS_DETACH:
{
// 後処理
MessageBox(NULL,_T("DLL 解放"),NULL,MB_OK);
}
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
return TRUE;
}
DLLのエントリーポイントです 使い方としてはDLLの初期化処理や後処理などを行うといいでしょう DLLHeader.hです // DLLHeader.h #pragma once #ifdef TESTDLL_EXPORTS // DLL側プロジェクトで定義されている #define _EXPORT __declspec(dllexport) #else #define _EXPORT __declspec(dllimport) #endif /* TESTDLL_EXPORTS */ 他のアプリケーションからDLL側の関数やクラスを呼び出すためには エクスポートするには次のようなエクスポートキーワードを __declspec(dllexport) インポートするには次のようなインポートキーワードを __declspec(dllimport) 普通に作ると同じ関数やクラス宣言なのに ここでポイントは次の一行です #ifdef TESTDLL_EXPORTS // DLL側プロジェクトで定義されている これはどこで定義(#define)されているのでしょうか? #ifdef TESTDLL_EXPORTS // DLL側プロジェクトで定義されている #define _EXPORT __declspec(dllexport) #else #define _EXPORT __declspec(dllimport) #endif /* TESTDLL_EXPORTS */ つまり、 使い方はTestClass.hで説明します TestClass.hです // TestClass.h
#pragma once
#include "DLLHeader.h"
// class エクスポート(インポート)キーワード クラス名
class _EXPORT TestClass
{
public:
TestClass(void);
virtual ~TestClass(void);
};
// 関数の場合は先頭にエクスポート(インポート)キーワードを付ける
_EXPORT void Test();
// エクスポートしない関数やクラスにはキーワードを付けない
void InOnlyDLLCall();
DLLHeader.hヘッダーのインクルードを忘れないでください TestClass.cppです // TestClass.cpp
#include "TestClass.h"
#include <tchar.h>
#include <windows.h>
TestClass::TestClass(void)
{
MessageBox(NULL,_T("DLLクラス呼び出し"),NULL,MB_OK);
}
TestClass::~TestClass(void)
{
}
void Test(){
InOnlyDLLCall();
}
void InOnlyDLLCall(){
MessageBox(NULL,_T("DLL関数呼び出し"),NULL,MB_OK);
}
特に気を付けることは何もありません では、早速今作ったDLLを使ってみましょう #include "TestClass.h"
#pragma comment(lib,"TestDLL.lib")
int main(){
TestClass testclass;
Test();
// エクスポートしてないのでリンカエラーとなる
//InOnlyDLLCall();
return 0;
}
ビルド→実行して ここで気を付けてほしいのはInOnlyDLLCall関数はエクスポートされていないので void _cdecl InOnlyDLLCall()の横に気味の悪い文字列が出てきます ?InOnlyDLLCall@@YAXXZ これは関数やクラスの名前修飾と呼ばれ 実は作成したLIBファイルにはDLLからエクスポートされた関数、クラスの名前修飾が書かれています コメントアウトを元に戻して さて、 // TestClass.cpp
#include "TestClass.h"
#include <tchar.h>
#include <windows.h>
TestClass::TestClass(void)
{
MessageBox(NULL,_T("DLLクラス呼び出し、差し替えver"),NULL,MB_OK);
}
TestClass::~TestClass(void)
{
}
void Test(){
InOnlyDLLCall();
}
void InOnlyDLLCall(){
MessageBox(NULL,_T("DLL関数呼び出し、差し替えver"),NULL,MB_OK);
}
ビルドしてできたDLLファイルを先ほどの実行ファイルフォルダのDLLと差し替えます いかがだったでしょうか? いちいちアプリケーション本体をビルドをしなくてよくなります 今回のソースファイルは下からダウンロードできます |