您的位置:首页 > 其它

动态库DLL中类的使用

2015-06-04 19:08 267 查看
一、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 //进程卸载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: