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