可供VC调用的QT编写的界面DLL方法
一般直接编写的QT动态库是无法被Windows下的VC6.0等调用的。
如下步骤
第一步:必须要在QT界面库源码下包含qtwinmigrate的源码包和库,网上可下载到。
第二步:在QT的proc文件中添加以下的一行 include,路径自行修改
第三步:在需要到处的动态库DLL的cpp文件中包含如下有关qtwinmigrate的头文件
第四步:基于前面的工作,如果你到处动态库,你需要调用动态库的最开始阶段比如自定义的DLL的init函数
编写下面的代码
基本的简单的工作到这里结束了,下面是我的参考文章
因为QT必须有调用QApplication的exec方法,这样才能产生消息循环,QT的程序才可以运行。所以说如果我们使用了QT编写了dll程序,在普通的 windows程序中是不能调用的。在调用的时候会出现错误。当然QT提供了解决方法:那就是QTWinmigrate
这里是QT官方网站对QTWinmigrate的介绍:
http://qt.nokia.com/products/appdev/add-on-products/catalog/4/Windows/qtwinmigrate
下面我来介绍一下使用QTWinmigrate来编写dll的方法。
首先,我们要重写DllMain函数:
#include <qtwinmigrate/qmfcapp.h>
#include <qtwinmigrate/qwinwidget.h>
#include <qmessagebox.h>
#include <windows.h>
BOOL WINAPI DllMain( HINSTANCE hInstance, DWORD dwReason, LPVOID lpvReserved )
{
static bool ownApplication = FALSE;
if ( dwReason == DLL_PROCESS_ATTACH )
ownApplication = QMfcApp::pluginInstance( hInstance );
if ( dwReason == DLL_PROCESS_DETACH && ownApplication )
delete qApp;
return TRUE;
}
大家都知道DllMain函数是windows动态库的入口函数,如果在dll中使用了QT的ui界面前,全局的QApplication必须首先 要创建,并且应用程序必须创建EventLoop。
进入到QmfcApp::pluginInstance方法中去,
bool QMfcApp::pluginInstance(Qt::HANDLE plugin)
{
if (qApp)
return FALSE;
QT_WA({
hhook = SetWindowsHookExW(WH_GETMESSAGE, QtFilterProc, 0, GetCurrentThreadId());
}, {
hhook = SetWindowsHookExA(WH_GETMESSAGE, QtFilterProc, 0, GetCurrentThreadId());
});
int argc = 0;
(void)new QApplication(argc, 0);
if (plugin) {
char filename[256];
if (GetModuleFileNameA((HINSTANCE)plugin, filename, 255))
LoadLibraryA(filename);
}return TRUE;
}
我们可以看到:Qapplication被创建了出来。QmfcApp::pluginInstanc是为了保证进程中存在一个Qapplication 对象,并且dll要把这个Qapplication的实例加载到内存中。
下面是dll中的导出函数:
extern “C” __declspec(dllexport) bool showDialog( HWND parent )
{
QWinWidget win( parent );
win.showCentered();
QMessageBox::about( &win, “About QtMfc”, “QtMfc Version 1.0\nCopyright (C) 2003″ );return TRUE;
}
dll中的导出函数要用extern “C”形式,QwinWidget为native win32窗口提供堆栈等等。
这样还没有写完程序。不行你拿这个程序来
qmake -project
qmake
nmake
这样是无论如何也编译不过的。
如果你仔细看qtwinmigrate的example的话,你就会注意到:
include(D:\qt4.4.3\qtwinmigrate-2.8-opensource\src\qtwinmigrate.pri)
编译的时候一定要在*.pro文件中加上
相关文章
- Qt信号与槽使用方法最完整总结
- Qt中创建、写入、删除(INI、XML文件)
- QT中操作Txt文件(Qt中QString与QByteArray互相转化方法)
- Qt-事件过滤器eventFilter概念及使用方法实例
- Qt 设置窗口背景图片的几种方法实例
- Qt编译数据库插件通用步骤说明
- Qt编写物联网管理平台30-用户登录退出
- Qt编写安防视频监控系统37-onvif预置位
- Qt通用方法及类库12
- Qt通用方法及类库4
- Qt编写气体安全管理系统5-数据监控
- Qt编写自定义控件37-发光按钮(会呼吸的痛)
- Qt插件开发入门(两种方法:High-Level API接口,Low-Level API接口)
- Playing with coroutines and Qt
- 翻译 | Qt研发副总裁分享2018年工作计划
- Qt之QFtp
- Qt之QDateTimeEdit
- Qt之自定义界面(QMessageBox)
- Qt error:QtThese QT version are inaccessible
- 【正点原子Linux连载】第二十一章 USER-KEY 摘自【正点原子】I.MX6U嵌入式Qt开发指南V1.0.2
- Qt常见bug
- Qt qDebug() 的使用方法
- 涵盖了 Java、Qt、AI、R 语言以及 Linux 学习的学习类开源项目