• QT实现Windows下DLL程序编写


    QT实现Windows下DLL程序编写

    2011-06-16 10:09

    https://mobile.51cto.com/symbian-269413.htm

    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 Copyright (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.3qtwinmigrate-2.8-opensourcesrcqtwinmigrate.pri) 

    编译的时候一定要在*.pro文件中加上。

    小结:关于在QT实现WindowsDLL程序编写,内容介绍完了,QApplication这个类还是起来很大的作用。QT必须有调用QApplication的exec方法,这样才能产生消息循环,QT的程序才可以运行。

    ================ End

  • 相关阅读:
    struts的action直接输出中文备注【原创】
    iframe高度处理【原创】
    Gel备注【原创】
    关于用jsp生成xml的问题【原创】
    网上流行的flash切换图片之研究【原创】
    c#连mysql的latin1编码乱码问题
    windows phone 7图片搜索小工具(源码)
    家猫js类库
    理解c#中的readonly,const与enum枚举
    Silverlight 雷达图和一种特殊泡泡画法
  • 原文地址:https://www.cnblogs.com/lsgxeva/p/12929214.html
Copyright © 2020-2023  润新知