QT创建与调用Dll方法(包括类成员)--显式调用

Qt程序中调用C#编写的dll 最近在使用Qt整合以前的一个工具时,发现有几个dll是采用C#写的,当然可以把C#写的dll重新在Qt中用C++写,虽然这是几个C#写的dll的函数接口使用的参数都比较简单,只用了int和string类型等,但在函数内部却还使用了C#的专用一些类,如果重写还是很麻烦,就查找了一些文章,多数都是说采用把C#写的dll采用COM注册方式让Qt调用,但是这样又要重新编译以前的C#项目,实在是很麻烦,所以... 阅读详情

看网上的好多关于QT调用Dll的方法,大部分都是调用函数的,并没有调用C++类成员的情况,即使是有,比如说:

Qt 一步一步实现dll调用(附源码)---(这一篇里没有调用类成员的)

Qt调用dll中的功能函数

​我就是按照这上面的教程一步步做的,可惜了都没成功~~~这里面都有一个最重要的步骤没有说清楚(可能怪我笨~~),路径问题!!!

所以这里自我做一下总结:

创建时选择C++ Library就可以了,然后选择Shared Library(共享库),其他默认OK。

创建好后文件如下(我这里工程名为:dll)

其中dll.pro代码为:

1
2
3
4
5
6
7
8
9
10
11
12
TARGET = dll
TEMPLATE = lib
DEFINES += DLL_LIBRARY
SOURCES += \
     dll.cpp
HEADERS +=\
         dll_global.h \
     dll.h
unix {
     target.path = /usr/lib
     INSTALLS += target
}

dll_global.h代码为:

1
2
3
4
5
6
7
8
9
#ifndef DLL_GLOBAL_H
#define DLL_GLOBAL_H
#include <QtCore/qglobal.h>
#if defined(DLL_LIBRARY)
#  define DLLSHARED_EXPORT Q_DECL_EXPORT
#else
#  define DLLSHARED_EXPORT Q_DECL_IMPORT
#endif
#endif // DLL_GLOBAL_H

dll.h代码为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#ifndef DLL_H
#define DLL_H
#include <string>
#include "dll_global.h"
using  namespace  std;
class  DLLSHARED_EXPORT Dll
{
public :
     Dll();
     ~Dll();
     void  Print();
     string GetStrAdd(string str1, string str2);
};
extern  "C" {
     DLLSHARED_EXPORT Dll* getDllObject(); //获取类Dll的对象
     DLLSHARED_EXPORT void  releseDllObject(Dll*); //获取类Dll的对象
     DLLSHARED_EXPORT void  helloWorld();
     DLLSHARED_EXPORT int  add( int  a, int  b);
}
#endif // DLL_H

dll.cpp代码为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include "dll.h"
#include <iostream>
Dll::Dll()
{
     std::cout<< "New Dll Object !" <<endl;
}
Dll::~Dll(){
     std::cout<< "Dll Object Des~~" <<endl;
}
void  Dll::Print ()
{
     std::cout<< "Dll::Print !" <<endl;
}
string Dll::GetStrAdd (string str1, string str2)
{
     string s=str1+str2;
     std::cout<< "Dll::GetStrAdd->return->" <<s<<endl;
     return  (s);
}
 
void  helloWorld()
{
     std::cout << "GlobalFun->hello,world!" <<endl;
}
int  add( int  a, int  b)
{
     std::cout<< "GlobalFun->add->return->" <<(a+b)<<endl;
     return  a + b;
}
Dll* getDllObject()
{
     return  new  Dll();
}
void  releseDllObject(Dll* dll){
     delete  dll;
}

运行后在生成目录里生成了dll.dll、libdll.a、dll.o三个文件(Windows下使用MinGW编译运行),如图:

新建一个调用项目”DllTest“:

将dll.h和dll_global.h两个文件放到代码目录中:


其中DllTest.pro代码如下:

1
2
3
4
5
6
greaterThan(QT_MAJOR_VERSION, 4 ): QT += widgets
TARGET = DllTest
TEMPLATE = app
SOURCES += main.cpp
LIBS +=dll.dll       #很重要!路径设置问题,如果错了就没有如果了~~~
LIBS +=”D:/API/dll.dll"   #~Right!

 

1
2
3
4
5
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = DllTest
TEMPLATE = app
SOURCES += main.cpp
LIBS +=dll.dll       #很重要!路径设置问题,如果错了就没有如果了~~~

main.cpp代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
//#include <QtCore/QCoreApplication>
#include <iostream>
#include <QLibrary>
#include "dll.h"  //头文件还是需要加的,否则无法解析Dll类
typedef  Dll* (*CreatDll)(); //定义函数指针,获取类Dll对象;
typedef  bool  (*ReleseDll)(Dll*);
typedef  void  (*fun)();
int  main( )
{
//    QCoreApplication a(argc, argv);
     QLibrary mylib( "dll.dll" );   //声明所用到的dll文件
     //判断是否正确加载
     if  (mylib.load())
     {
             std::cout << "DLL  loaded!" <<std::endl;
             CreatDll creatDll = (CreatDll)mylib.resolve( "getDllObject" );
             ReleseDll decDll=(ReleseDll)mylib.resolve ( "releseDllObject" );
             fun hello=(fun)mylib.resolve ( "helloWorld" );
             if (hello)hello();
             if (creatDll&&decDll)
             {
                 Dll *testDll = creatDll();
                 testDll->GetStrAdd ( "abc" , "ABD" );
                 testDll->Print ();
                 decDll(testDll);
             }
     }
     //加载失败
     else
         std::cout << "DLL is not loaded!" <<std::endl;
//    return a.exec();
     mylib.unload ();
     return  0;
}
 
//输出为:
DLL  loaded!
GlobalFun->hello,world!
New Dll Object !
Dll::GetStrAdd-> return ->abcABD
Dll::Print !
Dll Object Des~~

这里将dll.dll文件放到调用项目的生成目录下(Debug上面一层)即DllTest-Debug(我这里是这个名字,你那里可能不同)目录下:

编译,运行,OK!

这里要特别注意dll.dll的存放位置,还有要在.pro文件中增加一个 LIBS += dll.dll 用来指示路径,也可使用绝对路径如先将dll.dll放到D:/API/下,则应该设置为:LIBS += "D:/API/dll.dll"

如果想在资源管理器中直接双击exe文件打开,则dll.dll要放到和exe同目录下!

这个是显式调用的方法!

代码下载 http://download.youkuaiyun.com/detail/lomper/8183207

说明:下载的代码下载好后,要将LIBS += "D:/API/dll.dll" 更改成:LIBS += dll.dll 就可直接运行了。(项目DllTest.pro)

Qt——pro文件的使用&Qt调用dll 一、如何查找资料 学会利用官方文档很重要,这里我简单地讲下怎么找到我们想要的内容比如这篇文章的主题--pro文件。 搜索Qt Document   在搜索栏中输入pro file,即可看到.pro文件的所有相关文档 点击第二个链接,就可以看到pro文件的一些细节了。 当然,也可以在Qt Creator中找到document,只是可以搜索起来不是那么方便。 二、pro文件概述 ... 阅读详情

相关推荐

QT编写和调用dll动态库最新版(隐式调用)

网上也有不少教程,但是很多都是只讲述了如何做,没有说为什么,导致很多迷惑,当然包括我。今天仔细尝试了,现在把结果说出来,大家共同学习。 首先我们来创建一个简单的dll,实现两个数相加。 1.首先是新建项目,这里我们选择创建一个library,c++库 2.接下来给你的项目,我的叫plus,点击下一步给类命名,我的类叫PlusFun 2.接下来就是一直下一步了。 然后这是我

CN小黑 1万+

QT中实现DLL及调用示例

QT中自己实现DLL及调用,显示调用和隐式调用 若使用MinGW编译:编译后会生成dll.dll、libdll.a、dll.o三个文件,.dll是在Windows下使用的,.o是在Linux/Unix下使用的,.a是静态库。#include "dll.h" //头文件还是需要加的,否则无法解析Dll类。

热土程序园,利他愉己~ 3356

QT显式调用MFC动态库(DLL)方法(学习记录)

代码如下: //==================================================MFC================================================== void ShowTest() { AFX_MANAGE_STATE(AfxGetStaticModuleState());////需要加上.不然调用带界面的MFC_DLL的话界面不会显示. qTestDll dlg; dlg.DoModal();//界面调用 } //====

weixin_44813785的博客 2189

Qt6之调用Windows下vc生成的动态链接库dll

无论采用哪种方法编译,最终都会生成dll文件和lib文件 (导入库文件)。

yanchenyu365的博客 6433

Qt中调用DLL的方法

Qt是一种跨平台的C++应用程序开发框架,它提供了丰富的功能和工具,使开发人员能够轻松地创建高质量的应用程序。在Qt中调用DLL可以帮助你扩展应用程序的功能,利用外部库提供的功能。记住,在使用DLL时要小心处理参数和返回值的类型,以确保正确的交互和数据传递。在Qt项目中创建一个头文件,用于定义DLL中的函数。在上面的示例中,我们调用了名为"addNumbers"的函数,并传递了两个整数参数。通常,建议将DLL文件放置在与可执行文件(.exe)相同的目录中,或者在系统的搜索路径中。希望这篇文章对你有帮助!

YjjOle的博客 2374

使用QT调用DLL方法

在使用DLL时,建议仔细阅读DLL的文档或提供者提供的说明,以确保正确地调用和使用DLL的方法。确保将DLL文件放置在QT项目的合适位置,以便在编译和运行时能够找到它。将"/path/to/dll"替换为DLL文件所在的路径,将"dllname"替换为DLL文件的名称(不包括文件扩展名)。在需要使用DLL方法的源文件中,包含DLL的头文件。通常,DLL的提供者会提供相应的头文件,其中包含了可用函数和方法的声明。确保将"dllFunction"替换为实际的DLL函数名,并提供适当的参数。

UhxzCombined的博客 3391

dll qt 相对路径_QT创建与调用Dll方法(包括类成员)--显式调用

看网上的好多关于QT调用Dll的方法,大部分都是调用函数的,并没有调用C++类成员的情况,即使是有,比如说:​我就是按照这上面的教程一步步做的,可惜了都没成功~~~这里面都有一个最重要的步骤没有说清楚(可能怪我笨~~),路径问题!!!所以这里自我做一下总结:创建时选择C++ Library就可以了,然后选择Shared Library(共享库),其他默认OK。创建好后文件如下(我这里工程名为:dl...

weixin_34669890的博客 513

从“破解”到应用:三菱数控系统M80协议逆向分析与工业数据采集网关搭建指南

本文深入解析三菱数控系统M80协议的逆向分析方法与工业数据采集网关搭建技术。通过TCP协议实现跨平台通信,详细介绍了M80协议的数据包结构、多语言实现方案(C#、Java、C/C++)以及Linux数据采集网关的架构设计与容器化部署。为工业自动化领域的开发者提供从协议分析到企业级数据采集落地的完整解决方案。

weixin_29228781的博客 1212

Qt显式调用C++写的dll + 外一篇

这些天在做一个工程,要用到Qt,所以特别研究了一下Qt显式调用链接库的问题。隐式调用就不那么想用了,个人感觉隐式调用既浪费内存,造成程序启动速度极慢,又容易造成链接错误(本人在ogre中深受链接错误之苦),所以只用了显式调用。以前只试过在MFC中显式调用dll,在Qt上还没试过。其实细细研究一下,相对于MFC的调用来说,Qt的调用也是大同小异的。在这里分享一下。 首先用VS写一个dll先(名字

Derry的专栏 1万+

2019年7月28日解决战网BLZBNTBNA00000005BLZBNTBNA00000006BLZBNTBTS0000005DBLZBNTBTS0000004A 007D0 008A4 00840

Blizzard—Battle.net—2019年7月28解决战网BLZBNTBNA00000005BLZBNTBNA00000006BLZBNTBTS0000005DBLZBNTBTS0000004A 007D0 008A4 008402019年7月28日再次更新写在前面■■■ 排查网路问题 ■■■■■■ 排查电脑自身问题 ■■■■尝试重置internet设置■网络的设置和防火墙规则■如果还是不...

MCGC高质人类协作会-MCG贴吧 3万+

coreldraw sp2精简版 x4_CorelDRAW X4下载-CorelDRAW X4 SP2 精简版_Win10镜像官网

CorelDRAW X4 SP2是一个专业图形设计软件,专用于矢量图形编辑与排版,借助其丰富的内容和专业图形设计、照片编辑和网站设计软件,您将能够随心所欲地表达自己的风格与创意,轻松创作徽标标志、广告标牌、车身贴和传单、模型绘制、插图描画、排版及分色输出等。CorelDRAW X4 SP2软件特色CorelDraw X4 相比两年前的 CorelDraw X3 加入了大量新特性,总计有50项以上,...

weixin_30346025的博客 8904

Qt:56---QT创建和使用动态链接库(.dll)

一、QT的动态链接库 QT的动态链接库编译后生成DLL文件(本文只讲解Windows下的动态库文件) DLL文件是在应用程序运行时才加载的,不像静态库那样在编译期就编到应用程序里。若更新了DLL文件,只要接口未变,应用程序依然可以调用 使用动态链接库可以很方便地扩展应用程序的功能,但是DLL文件需要随应用程序一起发布,并且编译DLL和应用程序的Qt版本最好保持一致,否则考虑二进制兼容问题 二...

董哥的黑板报 1万+

瑞萨芯片串口配置,基于RL78芯片的串口使用配置

在这里隆重给大家介绍瑞萨编辑器CS+ for CA 的自动生成代码功能,只需要配置几个参数,就可以得到你想要的串口配置了,我现在已经忘记怎么手动配置寄存器了,哈哈。选择设置,此时将端口设置成功接下来设置时钟,根据自己的芯片所需设置相应的时钟,自己芯片是什么时钟查看数据手册和原理图可以找到。瑞萨芯片的串口配置其实和ST芯片的串口配置差不多,只是ST芯片的中文数据手册比较多,就更好配置了,找到所需要的串口配置IO口,此时将UART0 配置为引脚P61和P62,瑞萨芯片的串口配置竟然要配置串口。

qq_45315904的博客 4303

Qt DLL总结-创建及调用QT的 DLL

Qt DLL总结【二】-创建及调用QT的 DLL QTDLL创建调用    目录 Qt DLL总结【一】-链接库预备知识 Qt DLL总结【二】-创建及调用QT的 DLL   Qt DLL总结【三】-VS2008+Qt 使用QPluginLoader访问DLL 开发环境:VS2008+Qt4.7.4   最近看了不少Qt的DLL例子,总结一下如何创建和调用QT 动态链接库

信笔涂鸦 1874

海康工业相机硬件触发与YOLOv5实时检测的工业自动化实践

本文详细介绍了如何将海康工业相机的硬件触发模式与YOLOv5目标检测模型相结合,构建一套高实时性的工业自动化质检系统。文章从产线痛点出发,深入解析了硬件接线、SDK回调取图的实战技巧(包括规避常见Bug),并展示了如何将YOLOv5封装为服务,最终通过Flask API串联业务逻辑,实现从精准触发到实时AI判断的完整落地流程。

k6l7m8n9的博客 492

行列式详解:从定义到应用

本文系统介绍了行列式的核心概念和应用。首先从二阶、三阶行列式入手,逐步扩展到n阶行列式的定义,讲解了余子式和代数余子式的概念。其次,详细阐述了行列式的重要性质,包括转置不变性、行列交换变号等基本性质以及乘积性质等推论。在计算方法方面,介绍了按行展开法、化上三角矩阵法等实用技巧,并列举了特殊行列式的计算案例。最后重点讨论了行列式在克拉默法则、矩阵可逆性判断、几何体积计算及线性相关性判断等领域的应用。文章强调理解行列式的几何意义和灵活运用性质的重要性,并给出了学习建议和常见误区提示。行列式作为连接代数与几何的桥

aichitang2024的博客 3036

qt/c++调用dll的方法实践

qt/c++调用dll的方法实践 关于c++调用dll的方法,应该说是很成熟的,很多文章介绍的也很详细,可以直接套用。 这里不在详述其原理,而只是根据实际使用做一个实践总结。 主程序添加dll中的头文件声明,联合该dll编译,直接调用dll内部函数–这是隐式调用的方法 这种方式下,生成dll的源代码文件必须要区分头文件和源文件。 比如:如下testdllc.h文件中定义了一个Functions类,定义了6个函数 #ifdef TESTDLLC_EXPORTS #define TESTDLLC_API _

xenonhu的博客 4691

Power EM与Signal EM解决办法与原理分析

1.面对power EM,首先检查missing via,补全via,还可以加宽,加密局部power mesh,一些power IO出pin有power EM问题,可以叠加多层线和垂直方向补power形成网络降低并联电阻和提供更多电流通路解决,这种方法还可以降低ir drop。3.先进工艺有一个via ladder的方法可以解决power/signal em问题,clock cell出pin绕线或者power rail连接power stripe通过搭梯子的方式连接,原理还是分流。

m0_61544122的博客 4749

QT创建与调用Dll方法包括类成员教程:助力Qt开发者掌握DLL交互技巧

QT创建与调用Dll方法包括类成员教程:助力Qt开发者掌握DLL交互技巧 去发现同类优质开源项目:https://gitcode.com/ QT创建与调用Dll方法包括类成员教程,为您提供QT与DLL完美交互的全方位指南。 项目介绍 QT创建与调用Dll方法包括类成员教程,是一个面向Qt开发者的实用教程项目。本项目专注于QT环境下的DLL创建与调用,包括如何显式调用类成员。教程旨在帮助Qt开发者掌...

gitblog_06750的博客 533

【EPS精品教程】EPS2016三维测图版安装教程(附EPS2016安装包下载地址)

EPS地理信息工作站是北京清华山维新技术开发有限公司历经十五年精心研发和打造,为满足“以地理信息服务为中心”的信息化测绘生产需求而推出的测绘生产活动多种业务模块集成化软件系统。主要功能有:(1)测绘与地理信息多业务模块集成管理;(2)多元多尺度多种类数据集成管理;(3)跨平台异构数据转换;(4)数据监理;(5)自动缩编与综合;(6)坐标转换与动态投影;(7)地理信息模板定制;(8)GIS地理信息描述与CAD图形表达一体化支持;(9)GIS数据库更新维护;(10)图形打印与地图出版。 一、安装过程 EP..

智慧空间实验室 2万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

DLL在Qt中的创建与使用

学习之前先了解一下链接库的基本知识链接库预备知识 库包含静态链接库 动态连接库 (动态装载:静态绑定与动态绑定) 目前以lib后缀的库有两种, 一种为静态链接库(Static Libary,以下简称“静态库”), 包含了实际的代码和符号 一种为动态连接库(DLL,以下简称“动态库”)的导入库(Import Libary,以下简称“导入库”)。 包括地址符号表。 动态链接库的调用 隐示连接

lovebird_27的专栏 6740

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Qt-调用dll动态链接库

事先写一个简单的dll文件(myDLL.dll),C版接口的。并且用我前两篇有关DLL文章里面的方法,从dll中导出了导入库(.lib)文件,dll中有两个函数,原型如下: voidHelloWorld(); //函数内部调用Win32 API,功能是弹出一个helloworld提示框 intadd(inta,intb); //实现两个数相加,并返回结果 下面分别通过显示调用和隐式调用两种方法,来模拟Qt如何调用外部dll文件中的功能函数 预备知识: 1...

u011555996的博客 1万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Qt显示链接调用dll库

Qt使用外部共享库有两种方法,隐式调用链共享库(有.lib和.h)和显式调用共享库(仅有.dll文件)。这里我分享显式调用共享库使用方法,显示要麻烦些,而且只有.dll文件。 一:在之前我必须讲讲我遇到的一些错误。我觉得对你肯定有帮助。 1.1 我们拿到只有.dll的共享库时,马上想到应该使用显式调用共享库 1.2 务必分析.dll,是32位or64位,我在这儿搞了好久,很纳闷???当时我编译用的...

我爱加菲猫 2786
上一篇: Velocity魔法堂系列一:入门示例
下一篇: 专注于ASP.NET MVC
boringY
博客等级 码龄12年 0粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值