Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1683036
  • 博文数量: 584
  • 博客积分: 13857
  • 博客等级: 上将
  • 技术积分: 11883
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-16 09:34

分类: WINDOWS

2011-04-07 09:53:36

因为QT必须有调用QApplicationexec方法,这样才能产生消息循环,QT的程序才可以运行。所以说如果我们使用了QT编写了dll程序,在普通的windows程序中是不能调用的。在调用的时候会出现错误。当然QT提供了解决方法:那就是

这里是QT官方网站对QTWinmigrate的介绍:

http://qt.nokia.com/products/appdev/add-on-products/catalog/4/Windows/qtwinmigrate

下面我来介绍一下使用QTWinmigrate来编写dll的方法。

首先,我们要重写DllMain函数:


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

大家都知道DllMain函数是windows动态库的入口函数,如果在dll中使用了QTui界面前,全局的QApplication必须首先要创建,并且应用程序必须创建EventLoop

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



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

 

我们可以看到:Qapplication被创建了出来。QmfcApp::pluginInstanc是为了保证进程中存在一个Qapplication对象,并且dll要把这个Qapplication的实例加载到内存中。

下面是dll中的导出函数:

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

dll中的导出函数要用extern "C"形式,QwinWidgetnative win32窗口提供堆栈等等。

 

这样还没有写完程序。不行你拿这个程序来

qmake -project

qmake

nmake

这样是无论如何也编译不过的。

如果你仔细看qtwinmigrate的example的话,你就会注意到:

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

 

编译的时候一定要在*.pro文件中加上这一句!切记,切记!

 

参考:

阅读(1324) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~