实现MFC中调用Qt编写的DLL(带窗体)

3 篇文章 0 订阅

一、首先新建一个Qt动态库工程(*.dll)

  1. 选择新建Libray=>C++ Libray项目
    在这里插入图片描述

  2. 因为我需要带ui界面的dll,所以依赖库这里选择Widgets(这里默认的是core,后面在项目的.pro文件中可以通过 Qt += core widgets 来添加相关的依赖)
    在这里插入图片描述

  3. 编译环境根据需要选择就好
    在这里插入图片描述

  4. 完成创建
    在这里插入图片描述

  5. 创建完成之后默认的文件目录是这样的:包含四个文件,.pro文件就不多所了,都知道是什么,可以看到QtCreator默认给我们创建了一个类,.h文件和.cpp文件都有,UNTITLEDDLL_GLOBAL_H文件是动态库导出相关的东西,我们可以将里面的东西拿出来用。
    在这里插入图片描述

  6. 要想dll中的类能被其他程序调用,就需要加上导出宏也就是上面看到的UNTITLEDDLL_GLOBAL_H文件中的内容:
    在这里插入图片描述

  7. 这里为了方便,我把这里面的东西取出来将相应的代码放到要导出的类上面,并稍作修改(具体改了哪里通过下面我修改好的类UntitledDLL头文件自行对比即可知晓),如下。这样我们就不需要UNTITLEDDLL_GLOBAL_H文件了,可以将其删除。

    #ifndef UNTITLEDDLL_H
    #define UNTITLEDDLL_H
    
    //添加的UNTITLEDDLL_GLOBAL_H文件的内容到UntitledDLL类中,导出此类需要的宏,注意修改的内容=====================================================================>>>
    //#ifndef UNTITLEDDLL_GLOBAL_H
    //#define UNTITLEDDLL_GLOBAL_H
    #if defined(UNTITLEDDLL_LIBRARY)
    #  define UNTITLEDDLL_EXPORT __declspec(dllexport)
    #else
    #  define UNTITLEDDLL_EXPORT __declspec(dllexport)
    #endif
    //=====================================================================>>>
    
    class UNTITLEDDLL_EXPORT UntitledDLL
    {
    public:
        UntitledDLL();
    };
    
    #endif // UNTITLEDDLL_H
    
    
  8. 添加ui界面,跟普通的添加界面方法一致。
    在这里插入图片描述

  9. 在新建的ui类头文件中加入上述宏定义

    //#ifndef FORM1_H
    //#define FORM1_H
    
    //=====================================================================>>>
    #ifndef UNTITLEDDLL_GLOBAL_H
    #define UNTITLEDDLL_GLOBAL_H
    
    #ifdef UNTITLEDDLL_LIBRARY
    #define FORM1_EXPORT  __declspec(dllexport)
    #else
    #define FORM1_EXPORT  __declspec(dllimport)
    #endif
    //=====================================================================>>>
        
    #include <QMainWindow>
    
    namespace Ui
    {
    class Form1;
    }
    
    class Form1 : public QMainWindow
    {
        Q_OBJECT
    
    public:
        explicit Form1(QWidget *parent = nullptr);
        ~Form1();
    
    private:
        Ui::Form1 *ui;
    };
    
    #endif // FORM1_H
    
  10. 定义MFC调用ui界面的导出函数,创建QApplication消息循环

    untitleddll.h

    #ifndef UNTITLEDDLL_H
    #define UNTITLEDDLL_H
    
    //#ifndef UNTITLEDDLL_GLOBAL_H
    //#define UNTITLEDDLL_GLOBAL_H
    #if defined(UNTITLEDDLL_LIBRARY)
    #  define UNTITLEDDLL_EXPORT __declspec(dllexport)
    #else
    #  define UNTITLEDDLL_EXPORT __declspec(dllexport)
    #endif
    
    class UNTITLEDDLL_EXPORT UntitledDLL
    {
    public:
        UntitledDLL();
    };
    
    extern "C" UNTITLEDDLL_EXPORT int testFormUI(int argc, char* argv[]);
    
    #endif // UNTITLEDDLL_H
    
    

    untitleddll.cpp

    #include "untitleddll.h"
    #include "form1.h"
    
    #include <QApplication>
    UntitledDLL::UntitledDLL()
    {
    }
    
    /**
    MFC中调用界面必须要先调用此函数,因为qt界面运行必须有调用QApplication的exec 方法,这样才能产生消息循环。
    */
    extern "C" UNTITLEDDLL_EXPORT int testFormUI(int argc, char* argv[])
    {
        QApplication a(argc, argv);
        Form1 f;
        f.show();
        return a.exec();
    }
    
    
  11. 编译生成dll,此例子在debug模式下编译。生成如下文件.lib和.dll文件,也就是我们需要的导入库和动态库了,接下来我们就可以拿着这两个文件和对应的类头文件去MFC调用了。
    在这里插入图片描述

二、在MFC中调用QT动态库

  1. 准备工作:
    ​ 将生成的动态库文件(.dll)放到MFC的编译目录下,也就是exe所在的那个目录,跟上面qt中的debug目录一个道理。
    ​ 将生成的.lib放在程序文件夹下,也就是MFC项目的根目录,你的MFC类文件的同文件下。
    ​ 将.h也放到程序文件夹中

  2. 引入头文件

    #include "untitleddll.h"
    #pragma comment(lib,"untitledDLL.lib")
    

​ 这里需要注意的是,头文件和.lib文件可以以路径的形式导入,不是必须放在类路径下的,例如:

#include "D:\\untitleddll\\untitleddll.h"
#pragma comment(lib,"D:\\build-untitledDLL-Desktop_x86_windows_msvc2017_pe_64bit-Debug\\debug\\untitledDLL.lib")
  1. 在需要的地方调用导出函数既可

    //调用Qt导出函数进入Qt的界面消息循环,打开qt窗口
    testFormUI(0,0);
    
  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值