QT调用dll、外部程序调用QT的dll.md

QT可以调用外部的dll,也可以调用QT的dll,外部程序也可以调用QT写的dll界面。

  • QT调用外部的dll
    直接使用 QLibrary::load() 加载dll,使用 QLibrary::resolve() 查找函数地址加载函数即可。

  • QT调用QT的dll

新建子目录项目:
这里写图片描述
添加子项目:
这里写图片描述
添加 Application 工程,然后把除了main.cpp之外的东西删掉,后面用这个调用 QT 的dll:
这里写图片描述
再添加一个子项目,选择c++库:
这里写图片描述
选择共享库:
这里写图片描述
把生成的testdll.cpp和testdll.h删除,然后添加一个界面:
这里写图片描述
修改外边的test.pro配置:

TEMPLATE = subdirs
#顺序编译
CONFIG += ordered
SUBDIRS += \
    testDll \
    test

修改test.exe的test.pro配置:

QT      += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = test
TEMPLATE = app
SOURCES += main.cpp
#包含路径
INCLUDEPATH +=  $$PWD/../testdll
#输出路径
CONFIG += debug_and_release
CONFIG(debug,debug|release){
    DESTDIR = $$PWD/../Debug
}else{
    DESTDIR = $$PWD/../Release
}
#链接lib
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../Release -ltestdll
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../Debug/ -ltestdll

修改 testdll.pro :

QT      += widgets
TARGET = testDll
TEMPLATE = lib
DEFINES += TESTDLL_LIBRARY
SOURCES += \
    dialog.cpp
HEADERS +=\
        testdll_global.h \
    dialog.h
unix {
    target.path = /usr/lib
    INSTALLS += target
}
FORMS += \
    dialog.ui
#编译路径
CONFIG += debug_and_release
CONFIG(debug,debug|release){
    DESTDIR = $$PWD/../Debug
}else{
    DESTDIR = $$PWD/../Release
}

main.cpp中使用dll:

#include <QApplication>
#include "dialog.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //使用dll
    Dialog d;
    d.show();
    return a.exec();
}
  • MFC调用QT写的dll界面

https://github.com/qtproject/qt-solutions/tree/master/qtwinmigrate 提供了MFC调用QT写的dll的方法。
新建testQt的dll子项目, 建立后删除.h和.cpp,添加一个界面,然后将 qtwinmigrate/src 目录下的 qmfcapp.cpp、qmfcapp.h、qwinwidget.cpp、qwinwidget.h qtwinmigrate\examples\qtdll 目录下的 main.cpp 复制到 testQt 目录下并添加到工程中。
使用QT5.5.1 mingw编译时需要把qwinwidget.cpp中包含 qplatformnativeinterface.h 的代码修改为:

#include <QtGui/5.5.1/QtGui/qpa/qplatformnativeinterface.h>

修改 main.cpp 中导出函数显示添加的界面:

extern "C" __declspec(dllexport) bool showDialog( HWND parent )
{
    QWinWidget win( parent );
    win.showCentered();
    //显示界面
    Dialog d(&win);
    d.exec();
    return TRUE;
}

用vs新建一个MFC工程,在按钮按下的地方加载testqt.dll并显示界面:

void CtestQtDllDlg::OnBnClickedButton1()
{
    TCHAR dllName[] = _T("testQt.dll");
    HMODULE hDLL = LoadLibrary(dllName);
    if (hDLL != NULL)
    {
        typedef bool(*pShow)(HWND parent);
        pShow fp1 = pShow(GetProcAddress(hDLL, "showDialog"));
        if (fp1 != NULL)
            fp1(m_hWnd);
        FreeLibrary(hDLL);
    }
    else
    {
        CString strInfo;
        strInfo.Format(_T("Cannot Find %s"), dllName);
        AfxMessageBox(strInfo);
    }
}

效果:
这里写图片描述
代码(QT5.5.1mingw VS2015):http://download.csdn.net/download/yangyang031213/10133694
https://github.com/yangyang0312/cpp/tree/master/Qt/TestQtDll

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页