动态库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文件
.cpp文件
我们看到上面的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 //进程卸载
在类名称前增加 _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 //进程卸载
相关文章推荐
- HDU 1258 【水dfs】
- MySql中的varchar类型
- msdb.dbo.sp_send_dbmail 用法简介
- 无限的路
- (10.3.1)产品经理应该先写需求文档还是先画原型?
- mouse_event() 函数综合鼠标击键和鼠标动作
- HTML DOM对象
- 利用ViewPager实现图片循环滚动
- 字符常见的几种编码方式
- w3c 学习html DOM
- Mysql中的sync_binlog参数
- 黑马程序员_java语言_多线程和设计模式
- [转]JavaScript 的同源策略
- IOS js调OC方法
- Android用户自动登录
- Xcode自带的查看视图布局的工具
- AsyncTask源码解析
- 【通过操作指针,与指针做函数參数'实现字串在主串中出现的次数,然后将出现的部分依照要求进行替换 】
- 约瑟夫问题-sdut 1197
- IT大武汉