用QT在Windows下編寫dll程式
轉自: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檔案中加上
相關文章
- windows下如何使用QT編寫dll程式WindowsQT
- VC在windows下編寫用於序列通訊的程式 (轉)Windows
- 為Linux 應用程式編寫 DLL(轉)Linux
- 在linux下用vim編寫一個C程式LinuxC程式
- 編寫第一個Qt程式QT
- 如何在windows下發布QT應用程式(qt專案打包)WindowsQT
- linux下QT在windows下執行LinuxQTWindows
- Windows下DLL程式設計技術及應用 (轉)Windows程式設計
- 用C語言編寫windows服務程式C語言Windows
- QT程式在windows下部署釋出QTWindows
- 在LINUX下編寫程式並執行Linux
- 在Windows下編譯WebRTCWindows編譯Web
- 全方位解讀DLL檔案—編寫DLL
- 用DLL控制Windows中程式的方法(轉)Windows
- 在Unix下用C編寫curses程式的一些常用模組(轉)
- Qt DLL總結【二】-建立及呼叫QT的 DLLQT
- C++編寫DLL的方法C++
- 在Windows下編寫並執行第一個ASP.NET 5 Preview Web API程式WindowsASP.NETViewWebAPI
- C++應用程式在Windows下的編譯、連結(四)動態連結C++Windows編譯
- WPA Supplicant 在Windows下的編譯Windows編譯
- Qt之qss檔案編寫QT
- 在Windows下用ant編譯Android應用生成apk安裝包Windows編譯AndroidAPK
- 使用Delphi呼叫C++編寫的DLLC++
- C#呼叫c++編寫的dllC#C++
- Windows系統下22款實用程式碼編輯器Windows
- 用匯編編寫DOS下的記憶體駐留程式(5) (轉)記憶體
- 用匯編編寫DOS下的記憶體駐留程式(3) (轉)記憶體
- 用匯編編寫DOS下的記憶體駐留程式(4) (轉)記憶體
- Golang 編譯windows應用程式Golang編譯Windows
- Qt學習之路(59): 編寫跨平臺的程式薦QT
- (轉)Qt之qss檔案編寫QT
- noVNC在Windows下的應用VNCWindows
- windows核心程式設計--DLL基本Windows程式設計
- 用Delphi編寫DelTree程式 (轉)
- Qt 編寫應用支援多語言版本--一個GUI應用示例QTGUI
- 用PHP編寫Android應用程式PHPAndroid
- Qt for Windows:Qt 5.8.0 MinGW 靜態編譯版本(包含OpenSSL)QTWindows編譯
- C# Windows Service 服務程式的編寫C#Windows