一、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 //进程卸载