Windows下如何使用QT编写dll程序

来自:http://blog.csdn.net/tingsking18/article/details/4967172

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函数:

  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;  
  13. }  

大家都知道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;  
  19. }  

 

我们可以看到: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;  
  8. }  

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文件中加上这一句!切记,切记!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值