不能直接运行,也不能直接接受消息。
API都在Dll中:
Kernel32.dll 管理内存、进程、线程
User32.dll 执行用户界面任务(窗口创建与消息传递)
GDI32.dll画图与显示文本
静态库:.lib,二进制文件,发布时不需要,仅仅在编译使用
动态库:需要一个引入库和DLL,引入库中包含了被Dll导出的函数和变量的符号名。
动态库的好处:
1
多种编程语言
2
增强产品功能
3
提供二次开发的平台
4
简化项目管理
5
节省磁盘空间和内存
6
资源共享
7
应用程序本地化
Dumpbin 查看
Vcvars32.bat 设置环境
Dumpbin -exports dll1.dll 查看动态链接库的导出函数
在动态库中需要导出的函数添加关键字:_declspec(dllexport)
在使用动态库文件中声明:_declspec(dllimport)
加载方式:
隐式加载
工程中设置库文件,文件中使用
Extern int add(?)
或者
_declspec(dllimport) int add(?)
定制一个动态库导出函数的头文件,为了使头文件通用,方法:
在dll1.h中:
#ifdef DLL1_API
#else
#define DLL1_API extern "C" _declspec(dllimport)
#endif
在dll1.cpp中
#define DLL1_API extern "C" _declspec(dllexport)
#include "Dll1.h"
导出整个类或者仅仅导出类中的某些成员函数:
class DLL1_API Point
{
public:
DLL1_API void output(int x,int y);
void test();
};
调用约定:
DEphi与C++调用约定不同!
使用 extern "C" 关键字,保证导入导出命名统一,主要在C++与C的名字改编问题。但这种方式只能用于全局变量和函数,不能适用于类。
_stdcall关键字的使用:没有,为C调用方式。
使用模块定义文件方式解决名字改编问题:
模块定义文件,新建.def文件,加入工程
Dll2.def:
LIBRARY Dll2
EXPORTS 下面为导出函数名字
add
subtract
显式加载
LoadLibrary加载动态库或可执行程序
HINSTANCE hInst;
hInst=LoadLibrary("Dll3.dll");
typedef int (/*_stdcall*/ *ADDPROC)(int a,int b); 定义函数指针类型
//ADDPROC Add=(ADDPROC)GetProcAddress(hInst,"?add@@YAHHH@Z");
ADDPROC Add=(ADDPROC)GetProcAddress(hInst,MAKEINTRESOURCE(1));
动态链接库小结
最新推荐文章于 2022-08-01 20:06:27 发布