精华内容
下载资源
问答
  • QT显式调用MFC动态库(DLL)方法(学习记录)
    2020-05-27 10:07:46

    代码如下:

    //==================================================MFC==================================================
    void ShowTest()
    {
    	AFX_MANAGE_STATE(AfxGetStaticModuleState());需要加上.不然调用带界面的MFC_DLL的话界面不会显示.
    	qTestDll dlg;
    	dlg.DoModal();//界面调用
    }
    //==================================================QT==================================================
    //调用MFC_DLL
    void qMfcTest::on_pushButton_clicked()
    {
        QLibrary lib("TEST_DLL_QT.dll");//MFC动态库名称(与.exe程序放同一级目录下)
    
        if(lib.load())
        {
            QMessageBox::information(this, "提示", "加载成功...");
            
            typedef void (*TestInterfaceFunType)();
    
            TestInterfaceFunType TestInterfaceFun = (TestInterfaceFunType)lib.resolve("ShowTest");//"ShowTest"为MFC_DLL接口函数
        
            TestInterfaceFun();//调用该接口函数
        }
        else
        {
            QMessageBox::information(this, "提示", "加载失败...");
            QMessageBox::information(this,"bad",lib.errorString());//弹出错误原因
            return;
        }
    }

    讲一讲学习过程遇到的几个问题:

    1. 提示加载失败,错误消息为找不到该动态库.

    解决:动态库应该放在.exe同级目录下.

    2. 提示加载失败,错误消息为一串错误代码.

    原因:QT编译为64位,MFC_DLL位32位.

    解决:把QT程序改为32位编译.

    3. 调用带界面的MFC_DLL,界面不显示.

    解决:调用界面前加上AFX_MANAGE_STATE(AfxGetStaticModuleState();

    更多相关内容
  • QT使用MFC编译的

    2021-03-27 16:59:01
    假定读者已有知识点 ...2、动态库 3、函数编译名称 4、MFC动态链接库和静态链接库的区别 5、extern "C"的作用 6、__stdcall和__cdecl调用区别 如果有不明白的,请移步另外一位作者文章或者自行百度 ...

    假定读者已有知识点

    1、静态库 

    2、动态库 

    3、函数编译名称

    4、MFC动态链接库和静态链接库的区别

    5、extern "C"的作用

    6、__stdcall和__cdecl调用区别

    如果有不明白的,请移步另外一位作者文章或者自行百度

    https://blog.csdn.net/dongchongyang/article/details/52926310?spm=1001.2014.3001.5506

     

    笔者阐述的知识点:

    1、首先跨编译器库的调用,静态库是无法实现的,因为规则不一样!如果有能实现的大神,请博客留言给我。

    2、只能用动态库的方式

         1)动态库导出类是不可行的,原因是编译规则不一样,类中的函数名称无法被另外一个编译器识别

         2)动态库只能导出纯C接口的函数!为什么不导出c++函数接口,也是因为编译名称不一样的原因

     

    下面开始讲如何MFC创建动态库给QT使用

    1、MFC创建动态库(笔者用的是VS2012)

    2、添加需要导出的函数头文件和cpp文件

    Fish.h 

    #pragma once
    
    
    // 为了让QT也能使用这个动态库,必须2个下划线!
    #ifdef _USRDLL
    #define FUNCTION_DLL_API __declspec(dllexport)
    #else
    #define FUNCTION_DLL_API __declspec(dllimport)
    #endif
    
    
    #ifdef __cplusplus
    extern "C"
    {
    #endif
    
    void FUNCTION_DLL_API Swim(void);
    
    #ifdef __cplusplus
    }
    #endif

     Fish.cpp

    #include "stdafx.h"
    #include "Fish.h"
    
    
    
    void Swim(void)
    {
    	CString str = TEXT("88Fish swim");
    	//::MessageBox(NULL, TEXT("Fish swim"), TEXT("Win32Lib"), MB_OK);
    	AfxMessageBox(str);
    }
    
    

    3、生成动态库,把生成的动态库拷贝到Qt工程调试目录下 

     

    4、qt工程调用MFC动态库的代码 

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <QDebug>
    #include <QLibrary>
    #include <QMessageBox>
    
    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
        , ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    
    void MainWindow::on_pushButton_clicked()
    {
        QString qexeFullPath = QCoreApplication::applicationDirPath() + "/FunctionDll.dll";
        QLibrary lib(qexeFullPath);
        if (!lib.load())
        {
            QMessageBox::warning(this, "Test", "找不到动态库");
            return;
        }
    
    
        typedef void (*SWimFunction)(void);
        SWimFunction Swim=(SWimFunction)lib.resolve("Swim");
        if (Swim == nullptr)
        {
            QMessageBox::warning(this, "Test", "找不到动态库中Swim函数");
        }
        else
        {
            Swim();
        }
    
        lib.unload();
    }
    

    运行结果如下: 

     

    5、另外一种调用方法,但是笔者不推荐

    同样把生成的动态库拷贝到Qt工程调试目录下 ,并且也拷贝一份和fish文件一起到Qt工程目录下

    pro文件中加

    LIBS += $$PWD/FunctionDll.dll

     

    调用过程,同样可以达到上面的效果

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include "Fish.h"
    
    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
        , ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    
    void MainWindow::on_pushButton_clicked()
    {
        Swim();
    }
    

     但是如果dll文件没在exe目录下,程序崩溃了,但是你不知道是什么原因导致的!!!!!

     

     

    展开全文
  • 简介:本人学习Qt一个星期了,利用Qt做的仿360界面,然后打包成动态库。 用C++的MFC对话框按钮调用Qt界面动态库,经测试成功。
  • 若该文为原创文章,未经允许不得转载 原博主博客地址:... 目录 前言 Demo 使用VS7建立MFC动态链接库 前提:需要安装VS中的MFC环境 建立MFC动态链接库 编写测试函数 动态库所需...

    若该文为原创文章,未经允许不得转载
    原博主博客地址:https://blog.csdn.net/qq21497936
    原博主博客导航:https://blog.csdn.net/qq21497936/article/details/102478062
    本文章博客地址:https://blog.csdn.net/qq21497936/article/details/95052025
    各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究

    红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…(点击传送门)

    其他(编程相关)(点击传送门)

    项目实战:Qt编译Qt库以及使用C#调用Qt库,并实现C#集成Qt的tcp客户端

    VS2017编写MFC库以及使用Qt调用MFC库方法

    VS2017编写纯C库以及使用C#调用C库方法

    Qt实用技巧:VS2017编写纯C库以及使用Qt调用C库方法

    关于 C#调用C库Dll,有回调函数时,只执行一次回调函数就直接挂掉 的解决方法

    关于 C#调用一个C/C++dll库运行时实现多个应用(静态变量区分) 的解决方法

    关于 C#调用c库,将C#的byte[]传入C库的方法和将C库的char*向上传入C#的回调函数byte[] 的方法

     

    前言

           一些控件MFC操作是非常合适的,先用MFC开发成dll,然后使用Qt调用。

     

    Demo

            下载地址:https://download.csdn.net/download/qq21497936/11295694

     

    使用VS7建立MFC动态链接库

    前提:需要安装VS中的MFC环境

           (注意:已安装可以忽略该步。)

           进入VS的检查更新:

          

          

          

           添加配置安装:

           

           安装中:

           

           等待安装完成:

            

    建立MFC动态链接库

            

            

            

    编写测试函数

            

            

    动态库所需要的头文件、编译库lib和运行库dll

           (注意:此方式,在QtCreator中失败)

            

            

     

    使用QtCreator调用MFC动态连接库

    脚本

           将dll拷贝到工程目录,开发过程中,为方便调试,使用脚本:

            

           请参照

    《Qt实用技巧:win将ffmpeg、opengl、osg等各种库封装成qt模块,运行需要dll,增加自动拷贝运行库到exe目录执行脚本》

                https://blog.csdn.net/qq21497936/article/details/93745527

    代码

            

    运行结果

            

     

    关于Qt给MFC传递中文的问题

            MFC CString和QT QString都采用unicode编码;而MFC中的char *采用GBK编码,QT中的char *采用UTF-8编码,这里关于字符的编码,有个规律就是和源码文件保存的编一致。

           所以Qt给MFC传递char*时,需要进行编码转换,如下:

    bool OptPptManager::openFile(QString fullPath)
    {
        bool ret = true;
    
        // MFC与QT对char *的编码不同
        QTextCodec * pCodec = QTextCodec::codecForName("GBK");
        QByteArray data = pCodec->fromUnicode(fullPath);
    
        char * p = data.data();
        if(0 != _pOpenPpt(p))
        {
            ret = false;
        }
        return ret;
    }
    

         

     

    入坑

    入坑一:用包含头文件、lib和dll的方式,出现头文件错误

    原因:

           MFC到处的dll的问文件中,将头文件包含到qtcreator的qt工程中,无法识别,导致语法错误。

    解决方法:

           使用QLibrary显式调用。

    入坑二:抽取函数失败

           

    原因:

            定义MFC库的时候没有在.def文件中声明

    解决方法:

          

    入坑三:传递中文的ppt路径挂掉(2019年7月10日补充)

    原因:

           MFC与Qt对字符的编码不同。

    解决方法:

           

     

    补充

    当前测试AFX_MANAGE_STATE(AfxGetStaticModuleState())区别

            

     

    原博主博客地址:https://blog.csdn.net/qq21497936
    原博主博客导航:https://blog.csdn.net/qq21497936/article/details/102478062
    本文章博客地址:https://blog.csdn.net/qq21497936/article/details/95052025

    展开全文
  • 最近因为项目需要,MFC调用Qt使用MinGW编译的dll,从开始的调用基础函数,到后面调用Qt界面,到隔离Qt发布所需的dll到单独的目录,遇到了各种各样的问题,好在最终都顺利解决了,于是打算写一个专题讲述这个问题,...

    最近因为项目需要,MFC调用Qt下使用MinGW编译的dll,从开始的调用基础函数,到后面调用Qt界面,到隔离Qt发布所需的dll到单独的目录,遇到了各种各样的问题,好在最终都顺利解决了,于是打算写一个专题讲述这个问题,由浅入深,特此分享,所有的工程都会完整提供,也是作为纪念,防止将来忘记了(虽然有代码备忘就是了)。

    首先,先从最基础,最简单的入手。

     第一步,创建Qt编译dll的工程,除了图中的选项选择c++ Library其他一路默认,生成一个名为EasyDll的工程。

    其中头文件和实现文件分别为,分别实现一个成员函数和一个静态成员函数测试。

    //author:autumoon
    //联系QQ:4589968
    //日期:2021-12-07
    
    #ifndef EASYDLL_H
    #define EASYDLL_H
    
    #include "easyDll_global.h"
    
    class EASYDLL_EXPORT EasyDll
    {
    public:
        EasyDll();
    
        int Add(int a, int b);
        static int AddStatic(int a, int b);
    };
    
    #endif // EASYDLL_H
    
    //author:autumoon
    //联系QQ:4589968
    //日期:2021-12-07
    
    #include "easydll.h"
    
    EasyDll::EasyDll()
    {
    }
    
    int EasyDll::Add(int a, int b)
    {
        return a + b;
    }
    
    int EasyDll::AddStatic(int a, int b)
    {
        return a + b;
    }
    

    因为Qt工程才可以直接调用Qt的基于QObject的导出类,而MFC不行,所以需要使用

    extern "C"

    声明导出接口。

    //author:autumoon
    //联系QQ:4589968
    //日期:2021-12-07
    
    #ifndef EXTERNCINTERFACE_H
    #define EXTERNCINTERFACE_H
    
    extern "C"
    {
    
    //初始化
    __declspec(dllexport) int Add(int a, int b);
    
    //是否显示窗口
    __declspec(dllexport) int AddStatic(int a, int b);
    
    }
    
    #endif // EXTERNCINTERFACE_H
    

    实现:

    //author:autumoon
    //联系QQ:4589968
    //日期:2021-12-07
    
    #include "ExternCInterface.h"
    #include "easydll.h"
    
    int Add(int a, int b)
    {
        EasyDll ed;
    
        return ed.Add(a , b);
    }
    
    int AddStatic(int a, int b)
    {
        return EasyDll::AddStatic(a, b);
    }
    

    编译,生成easyDll.dll。

    将easyDll.dll移动到单独的目录,使用windeployqt命令,提取依赖的dll,具体方法为,如图所示的命令,如果Qt的版本不同,则位置对应不同。

     提示,可能不是qt的dll,这是因为我们的导出函数并没有使用Qt的组件,不管,但是这个步骤不能省略,尤其是以后复杂的dll导出的时候。

     使用vs2015新建Win32控制台应用程序的easyDllLoader工程,注意因为dll是x64的,所以这里也需要更改为x64的。

     编写测试代码,分别调用两个函数测试,关键是调用dll部分的代码。

    //author:autumoon
    //联系QQ:4589968
    //日期:2021-12-07
    
    // easyDllLoader.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include <iostream>
    #include <windows.h>
    
    using namespace std;
    
    int LoadQtAdd(int a, int b)
    {
    	HMODULE mod = LoadLibrary(_T("easyDll.dll"));
    	DWORD err = GetLastError();
    
    	int nSum = 0;
    
    	if (mod)
    	{
    		typedef int(*Add)(int, int);
    		Add add = (Add)GetProcAddress(mod, "Add");
    
    		nSum = add(a, b);
    
    		FreeLibrary(mod);
    	}
    
    	return nSum;
    }
    
    int LoadQtAddStatic(int a, int b)
    {
    	HMODULE mod = LoadLibrary(_T("easyDll.dll"));
    	DWORD err = GetLastError();
    
    	int nSum = 0;
    
    	if (mod)
    	{
    		typedef int(*Add)(int, int);
    		Add add = (Add)GetProcAddress(mod, "AddStatic");
    
    		nSum = add(a, b);
    
    		FreeLibrary(mod);
    	}
    
    	return nSum;
    }
    
    int main()
    {
    	int a = 3, b = 2;
    
    	cout << LoadQtAdd(a, b) << endl;
    	cout << LoadQtAddStatic(a, b) << endl;
    
    	getchar();
    
        return 0;
    }
    
    

    将easyDll放到easyDllLoader.exe同目录下,运行成功输出结果:

     至此,最简单的MFC调用Qt下使用MinGW编译的dll就完成了!

    由于本次调用并没有使用Qt的相关组件,所以非常简单,也基本不会遇到什么问题,但是一旦遇到需要调用Qt组件,问题就会变得复杂一些,后续继续更新。

    完整代码下载:easyDll.rar - 蓝奏云文件大小:6.3 K|https://autumoon.lanzoux.com/iztN7xc938f

    展开全文
  • 直接上源代码: //author:autumoon //联系QQ:4589968 //日期:2022-02-28 #ifndef HEARTBEATDLL_H #define HEARTBEATDLL_H int HeartBeatDll... } 主要是使用了QLibrary函数,基于C方式的导出即可。 测试界面:
  • Qt控件和窗口封装进dll中,并使用MFCQt应用程序写出demo来调用该dll。将dll中封装的Qt窗口嵌入到主程序中,实现窗口渲染和消息传递。
  • MFC调用QT类库

    2017-10-31 18:17:55
    MFC调用QT类库,实现QMessagebox弹出提示,在MFC动态创建QT控件!
  • 关于dll动态库的一些想法前言QT调用MFC的DLLMFC调用QT的DLL例子 前言 dll动态库是一种共享库,可以供执行程序在执行的过程中,动态的调用dll中的函数接口,而dll内部的实现则可以是任意形式。 从这点可以看出,理论...
  • QT调用mfc dll和qt dll

    热门讨论 2011-08-23 17:23:12
    该资源能够使用qt生成dll, 同时又mfc dll的例程,同时有使用qt调用 mfcqt dll的例程 。对于 学习使用qt dll很有帮助。
  • 通过使用Qt开发框架,生成dLL动态库,供MFC执行程序调用。实现MFC调用Qt界面显示。
  • MFC调用QT库

    千次阅读 2019-08-08 17:11:14
    首先说下版本:VS2013+qt-opensource-windows-x86-msvc2013-5.7.0.exe 插件:VS:VA_X_Setup2073.exe QTqt-vs-addin-1.2.5.exe ...1.在qtwinmigrate中的qtdll中,只要使用main.cpp的如下代码...
  • 该文件包含了Qt调用MFC的插件、调用DLL so文件的方式,具体的都以文档的形式罗列出来,文档中的例子全是亲自实践过了,完全可用。
  • 今天在不同的电脑用mfc使用LoadLibrary调用qt动态库,在某些电脑成功,某些电脑又失败。开始以为是宽字符的原因。可以看到在UNICODE编码下,LoadLibrary实际上是LoadLibraryW。 于是改成 HMODULE hDll = ...
  • VS2017 用MFC调用QT 带界面的动态库DLL

    千次阅读 2019-10-07 20:36:32
    本文主要参考... 主要是平台不一样,记录下实现过程。 VS平台:VS2017 QT:5.11.2 ...目的:使用MFC 调用QT动态库使用到的辅助文件qtwinmigrate,可以在这个网址下载。https://github.com/qtpro...
  • QT调用动态库,执行MFC窗口功能

    千次阅读 2018-11-29 11:36:09
    QTMFC使用的不同框架,提供不同的接口,以前MFC已经完善部分功能,且已封装为库,代码还多,不想全部用QT重写,于是想用QT调用动态库,执行MFC部分功能 1.导出函数 #pragma once #ifdef MyDll_EXPORTS #define...
  • MFC调用QT编写的DLL动态库

    千次阅读 2017-12-07 16:58:53
    MFC调用QT编写的动态库,如果QT dll里面用到了一些消息循环相关的接口,比如QTimer,QEventLoop等,会由于没有QAppAplication而导致这些调用出现异常,如果DLL里面没有界面显示的话,解决方法还是相对比较简单的。
  • 找一个懂MFC和qt的,帮我把mfc动态库转成qt动态库,然后用我一个qt程序能调用就可以了 这是一个带界面的动态库. 1
  • MFC CString和QT QString都采用unicode编码 MFC中的char *采用GBK编码,QT中的char *采用UTF-8编码,这里关于字符的编码,有个规律就是和源码文件保存的编一致。    // QT中QString的Unicode编码转GBK编码...
  • QtMFC的比较

    千次阅读 2021-04-07 20:11:23
    在当今基于C++的图形界面开发领域,能与Qt相抗衡的只有MFCMFC是微软公司的基础类库,自然得天独厚,比如开发深层次的Windows应用远超Qt,但Qt也有杀手锏,那就是跨平台。这两点大家一目了然,下面我们再来比较一下...
  • QTMFC的优缺点比较

    千次阅读 2021-02-20 20:25:35
    文章目录Document/View model伪对象 vs 真对象创建界面Unicode...MFC或多或少使用了面向对象的方法包装了Win32的- API,正因如此,这些API有时是C++,有时是C,甚至是C和C++的混合体。 - Qt这个C++的图形由Trollte
  • QT调用MFC生成的动态DLL,非空洞练手而写的例程,而是工程中为解决QT中打开文件QFileDialog时某些机器闪退的问题,有想了解混合编程调DLL的同学和遇到使用QFileDialog时程序闪退问题的同学可借鉴
  • 网上下载qmfcapp.h,qwinwidget.h头文件 #include "qtwinmigrate\qmfcapp.h" #include "qtwinmigrate\qwinwidget.h" BOOL WINAPI DllMain( HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpvReserved*/ ) ...
  • QT调用MFCDLL

    千次阅读 2016-12-16 16:04:48
    方式一:隐式调用 int nSum = ...在.pro文件中添加lib路径和文件 LIBS+= -L../***/***/***/lib -l*** -L后面跟的是lib路径 -l后面跟的是lib文件名,不要后缀.lib 因为库函数是以C来编译和链接的,
  • Qt嵌入MFC界面

    千次阅读 2020-10-13 17:34:45
    在VS下使用MFC调用动态连接进行数据的采集,将MFC的界面进行打包后使用Qt调用,并MFC的界面嵌入到Qt中,实现应有功能。 操作过程 1、将MFC编译的exe即相关的动态链接文件复制到Qt编译的工程目录下。 2、确定MFC...
  • qt使用动态库(DLL)

    万次阅读 2014-03-06 20:44:35
    本文主要讲解在QT开发环境中如何使用VC生成的DLL及QT自身生成的DLL。至于其它情况本文不作讨论。...由上可以看出动态库的lib和静态库的lib文件是不同的。  如果使用生成连接库的开发环境与使用连接库的
  • 场景:  QT 工程是GUI工程,实际工作中需要调用MFC 常规的动态库,遇到了启动就崩溃的问题,具体见截图。 问题截图: 通过以下配置,可以解决掉该问题:
  • 一、使用QT生成动态库。 1、使用QT新建工程,步骤New Project-->>Library-->>C++库。 2、给项目取名test21, 选择 “共享库”。 3、选择“Desktop Qt 5.9.1 MSVC2013 64bit”。 4、选择自己需要模块...
  • 文章目录动态链接库Dynamic Link VS 静态链接库 Static Link动态库调用方式 动态链接库Dynamic Link VS 静态链接库 Static Link https://zhuanlan.zhihu.com/p/71372182 ... 目标程序通常都不是独立个体,生成程序时都...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,946
精华内容 1,578
关键字:

qt使用MFC动态库