Windows下如何使用QT编写dll程序
2009-12-08 20:20
609 查看
版权声明
请尊重原创作品。转载请保持文章完整性,并以超链接形式注明原始作者“tingsking18”和主站点地址,方便其他朋友提问和指正。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函数:
#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文件中加上这一句!切记,切记!
参考:http://doc.trolltech.com/solutions/qtwinmigrate/winmigrate-qt-dll-example.html
相关文章推荐
- windows下如何使用QT编写dll程序 .
- windows下如何使用QT编写dll程序
- windows下如何使用QT编写dll程序
- Windows下如何使用QT编写dll程序
- Windows下如何使用QT编写dll程序
- Windows下如何使用QT编写dll程序
- Windows下如何使用QT编写dll程序
- windows qt 使用c++ posix接口编写多线程程序(真神奇)good
- 用QT在Windows下编写dll程序
- windows qt 使用c++ posix接口编写多线程程序(一)
- 用QT在Windows下编写dll程序
- VS使用QT编写dll程序
- 如何通过putty的ssh在windows上使用linux的Xwindows-GUI程序 zz
- 如何使用java程序实现windows锁屏
- VSTS 编写测试Test技巧:如何使用Deployment Items在测试类中引用文件,和普通Windows项目不一样哦。
- 如何让 Qt 的程序使用 Sleep(主线程没有Sleep函数,但线程可用自带的保护函数Sleep)
- 解决Tslib移植之后自己编写的QT程序不能使用触屏的问题
- 使用OPCDAAuto.dll编写C# OPC采集程序
- 在Windows 7 下使用Visual Studio 2010 编写自动申请管理员权限运行的程序
- 编写Qt Designer自定义控件(一)——如何创建并使用Qt自定义控件