假设外部第三方库为 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();

VS/QT--调用第三方库dll总结的更多相关文章

  1. 基于Qt的第三方库和控件

    ====================== 基于Qt的第三方库和控件 ======================     libQxt --------   http://dev.libqxt.o ...

  2. Android JNI如何调用第三方库

    http://www.2cto.com/kf/201504/388764.html Android JNI找不到第三方库的解决方案 cannot load library 最近做一个jni项目,拿到的 ...

  3. [置顶] android利用jni调用第三方库——第三篇——编写库android程序整合第三方库libhello.so到自己的库libhelloword.so

    0:前言: 在第二篇中,我们主要介绍了丙方android公司利用乙方C++公司给的动态库,直接调用库中的方法,但是这样方式受限于: 乙方C++公司开发的动态库是否符合jni的规范,如果不规范,则不能直 ...

  4. [置顶] android利用jni调用第三方库——第二篇——编写库android程序直接调用第三方库libhello.so

    0:前言 1:本文主要作为丙方android公司的身份来写 2:作者有不对的地方,请指出,谢谢 [第一篇:android利用jni调用第三方库——编写库libhello.so] [第二篇:androi ...

  5. [置顶] android调用第三方库——第四篇——调用多个第三方库

    0:前言: 在前面三篇中我们介绍了android调用第三方库的形式,在这一篇中我们介绍调用多个第三方库的Android.mk的写法,由于其他三篇介绍的很详细,这里只给出Android.mk的内容. [ ...

  6. 用NDK调用第三方库

    用NDK调用第三方库遇到不少坑,总结一下. 1.添加JNI目录 参考: http://www.cnblogs.com/lanqie/p/7442668.html 2.文件介绍: 其中:JniFacto ...

  7. android调用第三方库——第二篇——编写库android程序直接调用第三方库libhello.so (转载)

    转自:http://blog.csdn.net/jiuyueguang/article/details/9449737 版权声明:本文为博主原创文章,未经博主允许不得转载. 0:前言 1:本文主要作为 ...

  8. android调用第三方库——第一篇 (转载)

    转自:http://blog.csdn.net/jiuyueguang/article/details/9447245 版权声明:本文为博主原创文章,未经博主允许不得转载. 0:前言: 这两天一直在研 ...

  9. Veins(车载通信仿真框架)入门教程(二)——调用第三方库

    Veins(车载通信仿真框架)入门教程(二)——调用第三方库 在借助Veins进行自己的研究时我们经常需要实现一些比较复杂的功能,有时就需要借助第三方库的帮助. 博主的研究需要使用神经网络,但是自己编 ...

  10. 【C++】将调用第三方库的代码封装成动态库供上层调用

    需求分析 Java应用中需要调用C++的程序,而这个C++的程序中需要引入一个第三方静态库.所以需要将该程序编译成一个动态库文件(.so)供Java调用. 步骤 使用CLion创建一个动态库的项目,会 ...

随机推荐

  1. VMware虚拟软件使用方法、网络配置与远程连接排错方法

    一.虚拟软件使用方法 1. 软件启动方法 系统当中有些软件是可以多次启动,多实例 vmware不具有多实例功能 2. 软件关闭注意事项 尽量选择挂起虚拟主机关闭软件 3. 虚拟主机拍快照(后悔药 月光 ...

  2. iterator_traits技法

    问题 在 C++ 泛型编程中,如何知道"迭代器所指对象的类型",以便声明临时变量呢?我们把迭代器所指对象的类型称为value type. template <class It ...

  3. RA-Depth: Resolution Adaptive Self-Supervised Monocular Depth Estimation

    注:刚入门depth estimation,这也是以后的主要研究方向,欢迎同一个方向的加入QQ群(602708168)交流. 1. 论文简介 论文题目:RA-Depth: Resolution Ada ...

  4. 可迭代对象和迭代器对象以及for循环的本质

    目录 一.可迭代对象 二.迭代器对象 迭代器介绍: 迭代器对象: 迭代器对象的作用 迭代器对象实操: 注意事项 三.for循环的本质 一.可迭代对象 之前我们对于for循环为什么可以遍历没有做具体解释 ...

  5. Gateway服务网关 (入门到使用)

    Gateway服务网关 Gateway也要作为微服务注册到nacos中 Zuul也是网关但比较老是一种阻塞式编程:Spring Cloud Gateway 是 Spring Cloud 的一个全新项目 ...

  6. 企业级GitLab在Docker部署使用

    一.部署gitlab 这里使用的是Centos8,安装Docker环境 ,这里不说了,参考:https://www.cnblogs.com/wei325/p/15139701.html gitlab有 ...

  7. SQLSERVER 语句交错引发的死锁研究

    一:背景 1. 讲故事 相信大家在使用 SQLSERVER 的过程中经常会遇到 阻塞 和 死锁,尤其是 死锁,比如下面的输出: (1 row affected) Msg 1205, Level 13, ...

  8. 利用CRT配合VBS脚本实现自动化巡检

    利用CRT配合VBS脚本实现自动化巡检 以山石防火墙巡检为例 目录 利用CRT配合VBS脚本实现自动化巡检 1 设备列表文件:list.txt 2 VBS脚本: 2022山石巡检.vbs 3 使用方式 ...

  9. trollcave-v1-2

    trollcave-v1-2 目录 trollcave-v1-2 1 信息收集 1.1 端口扫描 1.2 后台目录扫描 1.3 收集网站相关信息 1.3.1 收集网站用户名与角色信息 1.3.2 收集 ...

  10. vue data为什么是函数

    vue data是函数的原因: 1.防止data复用: 2.data独立性: 3.作用域: 4.js的特性. 总结来说,如果data是一个函数的话,这样每复用一次组件,就会返回一份新的data(类似于 ...