成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

QT實現Windows下DLL程序編寫

移動開發
函數的可執行代碼位于一個DLL 中,該 DLL 包含一個或多個已被編譯、鏈接并與使用它們的進程分開存儲的函數。DLL 還有助于共享數據和資源。

DLL 是一個包含可由多個程序同時使用的代碼和數據的庫,DLL不是可執行文件。動態鏈接提供了一種方法,使進程可以調用不屬于其可執行代碼的函數。函數的可執行代碼位于一個DLL 中,該 DLL 包含一個或多個已被編譯、鏈接并與使用它們的進程分開存儲的函數。DLL 還有助于共享數據和資源。多個應用程序可同時訪問內存中單個DLL 副本的內容。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函數:

  1. #include <qtwinmigrate/qmfcapp.h> 
  2. #include <qtwinmigrate/qwinwidget.h> 
  3. #include <qmessagebox.h> 
  4. #include <windows.h> 
  5. BOOL WINAPI DllMain( HINSTANCE hInstance, DWORD dwReason, LPVOID lpvReserved )  
  6. {  
  7.     static bool ownApplication = FALSE;  
  8.     if ( dwReason == DLL_PROCESS_ATTACH )  
  9.         ownApplication = QMfcApp::pluginInstance( hInstance );  
  10.     if ( dwReason == DLL_PROCESS_DETACH && ownApplication )  
  11.         delete qApp;  
  12.     return TRUE;  

大家都知道DllMain函數是windows動態庫的入口函數,如果在dll中使用了QT的ui界面前,全局的QApplication必須首先要創建,并且應用程序必須創建EventLoop。

進入到QmfcApp::pluginInstance方法中去,

  1. bool QMfcApp::pluginInstance(Qt::HANDLE plugin)  
  2. {  
  3.     if (qApp)  
  4. return FALSE;  
  5.     QT_WA({  
  6. hhook = SetWindowsHookExW(WH_GETMESSAGE, QtFilterProc, 0, GetCurrentThreadId());  
  7.     }, {  
  8. hhook = SetWindowsHookExA(WH_GETMESSAGE, QtFilterProc, 0, GetCurrentThreadId());  
  9.     });  
  10.     int argc = 0;  
  11.     (void)new QApplication(argc, 0);  
  12.     if (plugin) {  
  13. char filename[256];  
  14. if (GetModuleFileNameA((HINSTANCE)plugin, filename, 255))  
  15.      LoadLibraryA(filename);  
  16.     }  
  17.  
  18.     return TRUE;  

我們可以看到:Qapplication被創建了出來。QmfcApp::pluginInstanc是為了保證進程中存在一個Qapplication 對象,并且dll要把這個Qapplication的實例加載到內存中。

下面是dll中的導出函數:

  1. extern “C” __declspec(dllexport) bool showDialog( HWND parent )  
  2. {  
  3.     QWinWidget win( parent );  
  4.     win.showCentered();  
  5.     QMessageBox::about( &win, “About QtMfc”, “QtMfc Version 1.0\nCopyright (C) 2003″ );  
  6.  
  7.     return TRUE;  

dll中的導出函數要用extern “C”形式,QwinWidget為native win32窗口提供堆棧等等。

這樣還沒有寫完程序。不行你拿這個程序來

  1. qmake -project  
  2. qmake  
  3. nmake 

這樣是無論如何也編譯不過的。

如果你仔細看qtwinmigrate的example的話,你就會注意到:

  1. include(D:\qt4.4.3\qtwinmigrate-2.8-opensource\src\qtwinmigrate.pri) 

編譯的時候一定要在*.pro文件中加上。

小結:關于在QT實現WindowsDLL程序編寫,內容介紹完了,QApplication這個類還是起來很大的作用。QT必須有調用QApplication的exec方法,這樣才能產生消息循環,QT的程序才可以運行。

責任編輯:zhaolei 來源: 互聯網
相關推薦

2011-06-24 09:01:20

Qt QLibrary dll

2011-06-16 17:54:30

Qt Mplayer

2009-09-25 11:04:07

C++動態加載DLL

2011-06-29 11:22:06

Qt Windows 入口函數

2011-06-21 16:40:58

Qt 靜態編譯

2011-06-08 17:59:43

Qt Creator

2011-07-05 17:54:43

QT Sqlite ARM

2011-06-24 17:05:07

QT QT 4.7.3 windows

2011-09-01 14:04:45

QT Webkit插件

2011-06-29 17:39:04

Qt 發布 編譯

2011-05-17 14:53:35

C

2009-08-14 15:06:08

Windows服務程序

2011-06-30 09:46:01

QT 顯示視頻 linux

2011-07-05 13:32:45

QT Mysql 驅動

2009-08-18 16:31:19

Visual C#編寫

2011-06-28 13:12:07

Qt 調用 DLL DLL

2011-06-21 17:01:44

Qt 靜態 編譯

2010-03-04 15:24:14

Python程序

2011-07-05 17:07:46

Qt 插件 模塊

2011-07-05 16:59:15

Qt 動態 鏈接庫
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产成人精品在线播放 | 亚洲一区二区av | 国产四区| 欧美精品首页 | 99久久久久| 欧美不卡在线 | 综合久久av | 亚洲精品国产电影 | 日本亚洲精品成人欧美一区 | 午夜电影合集 | 欧美二区三区 | 日韩激情在线 | 欧美一卡二卡在线观看 | 国产日韩欧美精品一区二区三区 | 亚洲精品影院 | 国产农村妇女精品一二区 | 色频| 欧美激情精品久久久久久 | 中文字幕一区二区在线观看 | 在线观看国产91 | 91视频在线看 | 狠狠干在线 | 精品国产一区二区国模嫣然 | 亚洲国产成人在线视频 | 久久久久久久久久久久久久av | 日韩在线观看视频一区 | 亚洲精品久久久久久久久久久久久 | 啪一啪 | 亚洲精品一区中文字幕乱码 | 亚洲欧美中文日韩在线v日本 | 中文字幕爱爱视频 | 久久手机视频 | 日韩高清一区二区 | 国产视频观看 | 91精品国产综合久久精品 | 日本中文在线 | 久久另类 | 午夜小视频在线观看 | 99爱国产 | 992人人草| 高清久久 |