• 可供VC调用的QT编写的界面DLL方法


    一般直接编写的QT动态库是无法被Windows下的VC6.0等调用的。

    如下步骤

    第一步:必须要在QT界面库源码下包含qtwinmigrate的源码包和库,网上可下载到。

    第二步:在QT的proc文件中添加以下的一行 include,路径自行修改

    第三步:在需要到处的动态库DLL的cpp文件中包含如下有关qtwinmigrate的头文件

    第四步:基于前面的工作,如果你到处动态库,你需要调用动态库的最开始阶段比如自定义的DLL的init函数

    编写下面的代码

    基本的简单的工作到这里结束了,下面是我的参考文章

    因为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 Copyright (C) 2003″ );

        return TRUE;
    }
    dll中的导出函数要用extern “C”形式,QwinWidget为native win32窗口提供堆栈等等。

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

    qmake -project

    qmake

    nmake

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

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

    include(D:qt4.4.3qtwinmigrate-2.8-opensourcesrcqtwinmigrate.pri)

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

  • 相关阅读:
    smb上传图片工具类
    hzero
    ORACLE
    数据库范式
    数据库设计阶段
    Java变量和运算符
    相对路径和绝对路径
    setTimeout()方法和setInterval()方法
    body onload()事件和table insertRow()、tr insertCell()
    eval函数和isNaN函数
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3180359.html
Copyright © 2020-2023  润新知