1. 程式人生 > >動態庫DLL中類的使用

動態庫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  
//程序解除安裝