VS/QT--调用第三方库dll总结
假设外部第三方库为 test.h,test.lib,test.dll,
调用的函数是 int fnTest(int param);
一、VS中的静态调用和动态调用
1.1 静态调用
静态调用需要用到第三方的文件:.h .dll .lib
静态调用跟使用本项目内的函数差不多,区别的一点在于本项目内的函数要在被调用之前声明,静态调用需要把第三方的头文件(.h)和lib文件导入到项目中。
导入第三方库的方法有2种:
①.在使用第三方库的文件中加入
#include "test.h" #pragma comment(lib,"test.lib")/*根据.h和.lib存放的路径设置*/ //调用时直接使用fnTest函数即可; int result = fnTest(4);
②.在项目-属性中设置
添加头文件:在属性界面,C++->常规->附加包含目录中加入头文件 test.h;
添加lib文件,在属性界面,链接器->常规->附加库目录中加入lib文件所在的目录 链接器->输入->附加依赖项中加入lib文件 test.lib;
注意上述的分号不要省略。
调用时直接使用fnTest函数即可;
int result = fnTest(4);
1.2 动态调用
当只有.dll文件时,可以采用动态调用;动态调用步骤如下:
//1.定义一个指针函数 typedef void(*fun) typedef int(*funcTest)(int); //2.定义一个句柄,获取dll的地址 HINSTANCE hDLL = LoadLibrary("test.dll"); if(nullptr == hDLL) { string s = "can not find dll"; throw std::exception(s.c_str()); } //3.定义一个函数指针获取函数地址 funcTest test = (funcTest)GetProcAddress(hDLL,"fnTest"); if(nullptr == test) { string s = "can not find function:fnTest"; throw std::exception(s.c_str()); } //4.通过定义的函数指针调用函数 int iResult = test(5); //最后一定要记得释放句柄,上述2,3,4步骤如果失败也要释放句柄 FreeLibrary(hDLL);
二、QT中的显式调用和隐式调用
2.1 隐式调用
QT的隐式调用与C++静态调用相似,两种方法
①.与C++静态调用方式相同;
②.在.pro文件空白位置单击右键,添加库
在库类型中选择"外部库",下一步,选择对应的库文件,平台和链接根据需要选择,下一步,完成.
然后再进行①操作.
2.2 显示调用
QT提供QLibrary类显式调用外部工具,具体步骤如下:
//1.定义一个指针函数 typedef void(*fun) typedef int(*funcTest)(int); //2.定义一个QLibrary类,加载dll QLibrary qlibDLL("test.dll); if(!qlibDLL.load())//加载dll { string s = "can not find dll"; throw std::exception(s.c_str()); } //3.定义一个函数指针获取函数地址 funcTest test = (funcTest)qlibDLL.resolve("fnTest"); if(nullptr == test) { string s = "can not find function:fnTest"; throw std::exception(s.c_str()); } //4.通过定义的函数指针调用函数 int iResult = test(5); //5.释放内存 qlibDLL.unload();