著作權聲明
請尊重原創作品。轉載請保持文章完整性,並以超連結形式註明原始作者“tingsking18”和主要站台地址,方便其他朋友提問和指正。
Windows下如何使用QT編寫dll程式
因為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><br />#include <qtwinmigrate/qwinwidget.h><br />#include <qmessagebox.h><br />#include <windows.h><br />BOOL WINAPI DllMain( HINSTANCE hInstance, DWORD dwReason, LPVOID lpvReserved )<br />{<br /> static bool ownApplication = FALSE;<br /> if ( dwReason == DLL_PROCESS_ATTACH )<br /> ownApplication = QMfcApp::pluginInstance( hInstance );<br /> if ( dwReason == DLL_PROCESS_DETACH && ownApplication )<br /> delete qApp;<br /> return TRUE;<br />}</p><p>
大家都知道DllMain函數是windows動態庫的入口函數,如果在dll中使用了QT的ui介面前,全域的QApplication必須首先要建立,並且應用程式必須建立EventLoop。
進入到QmfcApp::pluginInstance方法中去,
bool QMfcApp::pluginInstance(Qt::HANDLE plugin)<br />{<br /> if (qApp)<br />return FALSE;<br /> QT_WA({<br />hhook = SetWindowsHookExW(WH_GETMESSAGE, QtFilterProc, 0, GetCurrentThreadId());<br /> }, {<br />hhook = SetWindowsHookExA(WH_GETMESSAGE, QtFilterProc, 0, GetCurrentThreadId());<br /> });<br /> int argc = 0;<br /> (void)new QApplication(argc, 0);<br /> if (plugin) {<br />char filename[256];<br />if (GetModuleFileNameA((HINSTANCE)plugin, filename, 255))<br /> LoadLibraryA(filename);<br /> }</p><p> return TRUE;<br />}<br />
我們可以看到:Qapplication被建立了出來。QmfcApp::pluginInstanc是為了保證進程中存在一個Qapplication對象,並且dll要把這個Qapplication的執行個體載入到記憶體中。
下面是dll中的匯出函數:
extern "C" __declspec(dllexport) bool showDialog( HWND parent )<br />{<br /> QWinWidget win( parent );<br /> win.showCentered();<br /> QMessageBox::about( &win, "About QtMfc", "QtMfc Version 1.0/nCopyright (C) 2003" );</p><p> return TRUE;<br />}<br />
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檔案中加上這一句!切記,切記!
參考:http://doc.trolltech.com/solutions/qtwinmigrate/winmigrate-qt-dll-example.html