動態庫DLL中類的使用
一、DLL中類的匯出
在類名稱前增加 _declspec(dllexport)定義,例如:
class _declspec(dllexport) CMath{
....
};
通常使用預編譯開關切換類的匯入匯出定義,例如:
#ifdef DLLCLASS_EXPORTS
#define EXT_CLASS _declspec(dllexport)//DLL
#else
#define EXT_CLASS _declspec(dllimport)//使用者
#endif
class EXT_CLASS CMath{
...........
};
二、使用DLL中的類
1、匯入DLL的lib
2、類的定義
3、使用類
例子程式碼如下:
DLL類原始碼
.h檔案
#ifndef _DLL_CLASS_ #define _DLL_CLASS_ //定義匯入,匯出巨集開關. #ifdef DLLCLASS_EXPORT #define EXT_CLASS _declspec(dllexport) #else #define EXT_CLASS _declspec(dllimport) #endif class EXT_CLASS CMath { public: int Add(int num1,int num2); int Sub(int num1,int num2); }; #endif
.cpp檔案
#define DLLCLASS_EXPORT #include "DllClass.h" #include <WINDOWS.H> #include <CSTDIO> BOOL CALLBACK DllMain(HINSTANCE hInst,DWORD fDwReason,VOID* Reserve) { switch(fDwReason) { case DLL_PROCESS_ATTACH: { //初始化工作. printf(__TEXT("DllClass is loading.\r\n")); } break; case DLL_PROCESS_DETACH: { //善後處理工作. printf(__TEXT("DllClass is unloading.\r\n")); } break; case DLL_THREAD_ATTACH: { } break; case DLL_THREAD_DETACH: { } break; } return 1; } int CMath::Add(int num1,int num2) { return num1+num2; } int CMath::Sub(int num1,int num2) { return num1-num2; }
我們看到上面的DLL類中包含了DllMain(...)函式,這個函式為DLL動態庫的程式入口。
入口程式不是DLL必須的,常用於DLL內部初始化或善後處理。
BOOL WINAPI DllMain(
HINSTANCE hinstDLL,//動態庫例項控制代碼
DWORD fdwReason,//初呼叫原因
LPVOID lpvReserved//保留值
);返回TRUE,表示動態庫載入成功。
DllMain(.... ) 動態庫的載入或解除安裝時會被呼叫。例如:使用LoadLibrary或FreeLibrary時會被呼叫。
fdwReason取值如下:
#define DLL_PROCESS_ATTACH 1 //程序載入
#define DLL_THREAD_ATTACH 2 //執行緒載入
#define DLL_THREAD_DETACH 3 //執行緒解除安裝
#define DLL_PROCESS_DETACH 0 //程序解除安裝