qt写DLL文件并调用和出现的问题分析
2016-08-09 17:18
549 查看
qt是C+的一个框架,GUI编程简单,同时又能编写C+的库文件,有时候甚至只是改几行代码,就能把一个GUI程序修改成C+的.dll文件,下面看具体的过程:
首先建立一个新项目,选择C++库
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/02/40ee6fb728aaf9fabcbe9768b17213b9)
在这个界面会有模块的选择,选择你的DLL文件里面需要用到的库
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/02/801dd0e7fc3b80411a6be83663ca6f6e)
创建完新项目之后,这个类就是你创建的新项目
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/02/d84b2c8b9b83dabfc79cb20d48b81915)
接下来就要实现你自己的类和方法了
这里我只实现以个简单的方法。
/[b]*[/b].h文件***/
/[b]****[/b].cpp文件[b]*******[/b]/
然后编译,会在debug文件夹下面生成对应的.DLL文件。
这样我们的一个最简单的DLL文件就编写成功了,接下来我们就要谈谈Qt调用DLL文件。简单的来说,Qt调用dll文件的方法有很多种,可以利用win32的API,也可以使用Qt自带的API调用dll文件。我们先来看看Qt自带的API是怎么调用的。当然测试用例就要你自己写了。并把DLL文件和所有的.h文件复制到你的测试用例文件夹下面。
1、显式调用
如果你以为这样就可以了,那么我想告诉你还是太年轻了,运行之后妥妥的会出现这样的错误。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/02/d49b7f02ad91ad02d6fa4ab635d14b28)
你也可以调试一下,来看看调试信息,这里就不多啰嗦啦,出现这种错误的原因是在exe文件所在的文件夹里面,exe文件运行时找不到DLL文件,解决办法也很简单,把DLL文件 复制到exe文件所在的文件里面,没错,就是这么简单。
复制完之后再运行
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/02/2ef1b6f02c3b550323f4b839129f1c8e)
结果妥妥的。
2、隐式调用
当然这个和显示调用基本没有什么区别,只是一个可以看见,一个看不见而已
在Pro文件里面加入
这儿可以用绝对路径,当然也可以用相对路径咯
这时候的.cpp文件更简单
结果不用说当然是一样的咯!
在做实际项目的过程中我遇到了一个很是坑的问题,
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/02/74607f1f7c9424e13df73af3626439d8)
这个问题是因为指针的错误使用引起的,所以在实际的应用中,一定要注意指针的使用。
win32API的调用暂时没有测试,晚上测试用例很多,我就不写了,这样使用Qt写的DLL只适合Qt程序调用,如果要使用别的程序调用必须用
首先建立一个新项目,选择C++库
在这个界面会有模块的选择,选择你的DLL文件里面需要用到的库
创建完新项目之后,这个类就是你创建的新项目
接下来就要实现你自己的类和方法了
这里我只实现以个简单的方法。
/[b]*[/b].h文件***/
#ifndef UNTITLED2_H #define UNTITLED2_H #include "untitled2_global.h" class UNTITLED2SHARED_EXPORT Untitled2 { public: Untitled2(); int ADD(int a,int b); }; #endif // UNTITLED2_H
/[b]****[/b].cpp文件[b]*******[/b]/
#include "untitled2.h" //构造 Untitled2::Untitled2() { } //自己的方法 int Untitled2::ADD(int a, int b) { return a+b; }
然后编译,会在debug文件夹下面生成对应的.DLL文件。
这样我们的一个最简单的DLL文件就编写成功了,接下来我们就要谈谈Qt调用DLL文件。简单的来说,Qt调用dll文件的方法有很多种,可以利用win32的API,也可以使用Qt自带的API调用dll文件。我们先来看看Qt自带的API是怎么调用的。当然测试用例就要你自己写了。并把DLL文件和所有的.h文件复制到你的测试用例文件夹下面。
1、显式调用
#include "mainwindow.h" #include "ui_mainwindow.h" #include "untitled1.h" #include <QDebug> #include <QLibrary> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_pushButton_clicked() { //使用QLibrary类,将DLL文件引入 QLibrary m_pLibrary("F:\\Work_Space\\work\\untitled\\untitled.dll"); if (m_pLibrary.load()) { Untitled1 dll; qDebug()<<dll.add(2,4); } else { qDebug()<<m_pLibrary.errorString(); } }
如果你以为这样就可以了,那么我想告诉你还是太年轻了,运行之后妥妥的会出现这样的错误。
你也可以调试一下,来看看调试信息,这里就不多啰嗦啦,出现这种错误的原因是在exe文件所在的文件夹里面,exe文件运行时找不到DLL文件,解决办法也很简单,把DLL文件 复制到exe文件所在的文件里面,没错,就是这么简单。
复制完之后再运行
结果妥妥的。
2、隐式调用
当然这个和显示调用基本没有什么区别,只是一个可以看见,一个看不见而已
在Pro文件里面加入
这儿可以用绝对路径,当然也可以用相对路径咯
LIBS += "F:\Work_Space\work\untitled\untitled1.dll"
这时候的.cpp文件更简单
#include "mainwindow.h" #include "ui_mainwindow.h" #include "untitled1.h" #include <QDebug> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_pushButton_clicked() { Untitled1 dll; qDebug()<<dll.add(2,4); }
结果不用说当然是一样的咯!
在做实际项目的过程中我遇到了一个很是坑的问题,
这个问题是因为指针的错误使用引起的,所以在实际的应用中,一定要注意指针的使用。
win32API的调用暂时没有测试,晚上测试用例很多,我就不写了,这样使用Qt写的DLL只适合Qt程序调用,如果要使用别的程序调用必须用
extern "C" { }将方法包含,这样外界的程序才能调用。
相关文章推荐
- QT使用记录关于调用DLL库文件出现的问题
- 在EXE程序中调用DLL文件后出现_CrtIsValidHeapPointer(pUserData)问题的解决方法
- Qtopia Core 4.3(QT/E)交叉编译安装全过程--出现无法找到头文件zlib.h问题
- 实验: 调用Dll时的文件依赖问题
- Labwindows/CVI调用外部DLL文件的问题
- 执行文件下载Java 调用 FFMPEG 命令时用 url 作为输入源,Linux 下出现 “no such file or directory” 问题的解决
- silverlgiht 端调用 ashx 类型文件下载中文名文件出现名子乱码问题
- java调用CC++编写的DLL文件问题
- VS2005中,软件集成中“堆释放错误”的解决方案,调用自己dll可能会出现的问题!!!
- dll动态链接库之用类写配置文件和调用判断方法接口的实现中遇到的若干问题
- web调用cab不能注册dll、不能运行exe文件问题解决
- Qt中显示html文件出现乱码的问题
- JNA 调用 dll 文件 乱码问题
- BCB调用dll文件中注意的问题
- Qt调用任意文件、QDesktopServices::openUrl奇异问题
- windows下的动态链接问题(.dll文件的编写与调用)
- 在flash builder4中调用flash cs文件出现的问题
- 内核调用用户空间可执行文件以及潜在问题分析
- Qt调用OpenCV实现录制视频文件中的几个问题
- 解决IE8安装问题:复制文件 admparse.dll 时出现错误