返回顶部

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();

 

posted @ 2020-02-26 14:06  Zoya23  阅读(3989)  评论(0编辑  收藏  举报