QT實現(xiàn)Windows下DLL程序編寫
DLL 是一個包含可由多個程序同時使用的代碼和數(shù)據(jù)的庫,DLL不是可執(zhí)行文件。動態(tài)鏈接提供了一種方法,使進程可以調(diào)用不屬于其可執(zhí)行代碼的函數(shù)。函數(shù)的可執(zhí)行代碼位于一個DLL 中,該 DLL 包含一個或多個已被編譯、鏈接并與使用它們的進程分開存儲的函數(shù)。DLL 還有助于共享數(shù)據(jù)和資源。多個應(yīng)用程序可同時訪問內(nèi)存中單個DLL 副本的內(nèi)容。DLL 是一個包含可由多個程序同時使用的代碼和數(shù)據(jù)的庫。
因為QT必須有調(diào)用QApplication的exec方法,這樣才能產(chǎn)生消息循環(huán),QT的程序才可以運行。所以說如果我們使用了QT編寫了dll程序,在普通的 windows程序中是不能調(diào)用的。在調(diào)用的時候會出現(xiàn)錯誤。當(dāng)然QT提供了解決方法:那就是QTWinmigrate
這里是QT官方網(wǎng)站對QTWinmigrate的介紹:
http://qt.nokia.com/products/appdev/add-on-products/catalog/4/Windows/qtwinmigrate
下面我來介紹一下使用QTWinmigrate來編寫dll的方法。
首先,我們要重寫DllMain函數(shù):
- #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函數(shù)是windows動態(tài)庫的入口函數(shù),如果在dll中使用了QT的ui界面前,全局的QApplication必須首先要創(chuàng)建,并且應(yīng)用程序必須創(chuàng)建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被創(chuàng)建了出來。QmfcApp::pluginInstanc是為了保證進程中存在一個Qapplication 對象,并且dll要把這個Qapplication的實例加載到內(nèi)存中。
下面是dll中的導(dǎo)出函數(shù):
- 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中的導(dǎo)出函數(shù)要用extern “C”形式,QwinWidget為native win32窗口提供堆棧等等。
這樣還沒有寫完程序。不行你拿這個程序來
- qmake -project
 - qmake
 - nmake
 
這樣是無論如何也編譯不過的。
如果你仔細看qtwinmigrate的example的話,你就會注意到:
- include(D:\qt4.4.3\qtwinmigrate-2.8-opensource\src\qtwinmigrate.pri)
 
編譯的時候一定要在*.pro文件中加上。
小結(jié):關(guān)于在QT實現(xiàn)Windows下DLL程序編寫,內(nèi)容介紹完了,QApplication這個類還是起來很大的作用。QT必須有調(diào)用QApplication的exec方法,這樣才能產(chǎn)生消息循環(huán),QT的程序才可以運行。















 
 
 
 
 
 
 