dll是将一个项目模块化的非常重要的组成部分,因此将dll的学习过程和工作中的经验记录下来以便更好地梳理知识。
编译环境:Visual C++ 6.0
一、创建动态链接库
1、创建dll工程(dll工程又分为MFC Dll、Win 32 Dll,还可以自己创建单个.cpp文件)
2、在源文件*.cpp中编写函数(每个函数结尾不需要‘;’),并且在需要导出的函数前加 _declspec(dllexport),可参考下面代码:(我用了一个宏DLL_API 来定义_declspec(dllexport),也可以用_declspec(dllexport)直接加在导出函数的前面)
#ifdef DLL_API extern "C" _declspec(dllexport)
#else
#define DLL_API extern "C" _declspec(dllexport)
#endif
DLL_API int __stdcall addtest(int a,int b)
{
return a+b;
}
3、在头文件*.h中声明导出函数,将DLL1_API定义为export,供输出使用
#ifdef DLL_API extern "C" _declspec(dllexport)
#else
#define DLL_API extern "C" _declspec(dllexport)
#endif
DLL_API int addtest(int a,int b)
{
return a+b;
}
4、build生成dll,lib文件
到这里,已经完成了最基础的的函数的导出部分,还有导出类,这里没写出来,后续再加上。
还有一点需要注意的是,在创建动态链接库的时,有时会出现导出函数名字改编的问题,可以用模块定义文件*.def来消除问题,用法如下。也可以搜索关键字“dll名字改编”等关键去查找相关资料。
EXPORTS
addtest
二、调用动态链接库
- 静态调用
#pragma comment(lib,”mfcdlltest.lib”) //告诉编译器DLL相对应的lib文件所在路径和文件名
extern “C”_declspec(dllimport) int _stdcall addtest(int a,int b); //声明导入函数
3、在工程中使用函数addtest
- 动态调用
lpAddFun addFun; //函数指针
hDll = LoadLibrary("mfcdlltest.dll"); //动态加载DLL模块句柄
if( hDll )
{
addFun=(lpAddFun) GetProcAddress(hDll,"addtest"); //得到所加载DLL模块中函数的地址
if( addFun )
{
addFun(1,2);
}
}