用QT在Windows下编写dll程序

红薯 发布于 2010/09/22 23:13
阅读 4K+
收藏 7
Qt

因为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文件中加上

加载中
0
jingshishengxu
jingshishengxu

讲下 QT调用dll更好了

0
李永波
李永波

红薯 老大好厉害啊

你不是刚刚研究  QT 不久吗?

0
叶爱平

你说的这种方法是你的QT DLL中使用了QT的QGui中的东西。但假设你仅仅是实现一般功能的DLL,而又想借助QT强大的模板类,那么是不需要采用以上方式的。只需要按照普通的DLL开发过程就行了,我试过,没问题。若是所有在QT下开发的DLL都要上QGui这个库的话,太麻烦了。你说呢?

0
j
jack2012
 在QT5.2.1下无法编译通过!
0
j
jack2012
编译的时候, error: C3861: 'QT_WA': identifier not found 如何解决?
返回顶部
顶部