【问题标题】:Qt plugin application inside 3rd party application3rd 方应用程序中的 Qt 插件应用程序
【发布时间】:2015-04-09 00:49:46
【问题描述】:

我有一个 DLL 中的 Qt 应用程序,我需要与第三方非 Qt Windows 应用程序集成。我不拥有第 3 方应用程序,因此无法更改它们的核心事件处理机制(在某些情况下我什至没有源代码)。这样做的最佳方法是什么?

我尝试了 QtWinMigrate 框架,但这让我改变了 CWinApp::Run,这是我做不到的。如果我改为创建 QApplication 并调用 exec(),则会创建第二个事件循环。这种工作,但是一些非 Qt 应用程序事件现在神秘地消失了(例如工具提示和键盘命令停止工作)。

非常感谢任何想法。谢谢。

【问题讨论】:

    标签: qt


    【解决方案1】:

    我不相信有一个干净的解决方案(但我可能错了)。

    无论如何,您可以使用QCoreApplication::setEventFilter 来获取一些关键事件(对于按键、鼠标悬停等)并将它们提供给应用程序事件循环。这很丑陋,但它可能会完成工作。

    QCoreApplication::setEventFilter 接收具有以下签名的函数:

    bool myEventFilter(void *message, long *result);
    

    在 Windows 上,message 可以静态转换为 MSG。我对 Windows API 的了解有些生疏,但找出相关事件应该不难。

    我必须强调我非常不喜欢这个解决方案。我真诚地会在不使用 Qt 的情况下编写插件。但它应该可以工作,即使是以一种非常丑陋的方式。

    【讨论】:

    • 感谢您的反馈。我对此进行了调查,它在我的示例应用程序中工作(尽管我最终不得不在 QAbstractEventDispatcher 实例而不是 QApplication 上设置过滤器)。毋庸置疑,生产环境要复杂得多,我最终不得不在不同的线程上运行 2 个事件循环(并特别注意两个应用程序之间的通信!)。谢谢。
    • @Robin 什么都没有。我还处理了将新 Qt 代码与 MFC 遗留应用程序集成的问题。这种解决方案的问题在于它违反了 Qt 前提,就像单个事件循环一样,并且会产生非常微妙且难以跟踪的错误。无论如何,现实世界的问题需要现实世界的解决方案。祝你好运:)
    【解决方案2】:

    QtWinMigrate 是解决此问题的正确方法。它解决了 Qt 在 Win32 或 MFC 中的事件循环问题。不用改CWinApp::Run

    QMfcApp::pluginInstance 是 Qt DLL 与 MFC 事件循环一起工作所需要的。你在 DllMain 中设置它:

    #include <Windows.h>
    #include "qmfcapp.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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多