用QT在Windows下編寫dll程式

pamxy發表於2013-03-29

轉自:http://blog.csdn.net/yyzsyx/article/details/6086052

因為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的詳細資訊,或者下載地址請點這裡


相關文章