QT实现Windows下DLL程序编写
创始人
2024-07-31 21:31:57
0

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  
  2. #include  
  3. #include  
  4. #include  
  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的程序才可以运行。

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...