动态链接库的创建和使用(基础版)——学习记录

    xiaoxiao2021-03-26  19

    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

    二、调用动态链接库

    静态调用 1、把.lib、.dll、和.h头文件拷贝到工程目录下 2、添加h文件:(*.h) 

    #pragma comment(lib,”mfcdlltest.lib”) //告诉编译器DLL相对应的lib文件所在路径和文件名 

    extern “C”_declspec(dllimport) int _stdcall addtest(int a,int b); //声明导入函数 

    3、在工程中使用函数addtest

    动态调用 1、只需把.dll拷贝到运行目录下(注意是运行目录,如果单步调试时需拷贝在工程目录;运行exe需要放在exe同级目录下,路径可以自行设定) 2、加载并调用导出函数,使用完之后释放 typedef int (* lpAddFun)(int ,int);//定义一个与Add_new函数接受参数类型和返回值均相同的函数指针类型  …… …… HINSTANCE hDll; //句柄 lpAddFun addFun; //函数指针  hDll = LoadLibrary("mfcdlltest.dll"); //动态加载DLL模块句柄  if( hDll ) { addFun=(lpAddFun) GetProcAddress(hDll,"addtest"); //得到所加载DLL模块中函数的地址  if( addFun ) { addFun(1,2); FreeLibrary(hDll); //释放已经加载的DLL模块 } }     显然,使用动态链接库是比较简单的。怎么写好动态链接库显得更为重要,看导出的函数能否成功被调用以及函数本身的功能是否实现的这个过程需要不断调试。我在学习的时候也借鉴了一些前辈的总结的经验,大家还有不懂的也可以借鉴一下: http://blog.csdn.net/jarvischu/article/details/6559059

    转载请注明原文地址: https://ju.6miu.com/read-658563.html

    最新回复(0)