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と差し替えます いかがだったでしょうか? いちいちアプリケーション本体をビルドをしなくてよくなります 今回のソースファイルは下からダウンロードできます |