2011-01-12 6 views
0

サードパーティ製の非Qt Windowsアプリケーションと統合する必要があるDLLにQtアプリケーションがあります。私はサードパーティのアプリケーションを所有していないので、コアイベント処理メカニズムを変更することはできません(私はソースもありません)。これを行う最善の方法は何ですか?サードパーティアプリケーション内のQtプラグインアプリケーション

私はQtWinMigrateフレームワークを試しましたが、これで私はできないCWinApp :: Runを変更できます。代わりにQApplicationを作成してexec()を呼び出すと、2番目のイベントループが作成されます。このような作品では、非Qtアプリケーションイベントのいくつかが不思議に消えてしまいました(例えば、ツールチップやキーボードコマンドが機能しなくなりました)。

大変ありがとうございます。ありがとう。

答えて

1

私はそこにきれいな解決策があるとは思わないが(私は間違っているかもしれない)。

とにかく、QCoreApplication::setEventFilterを使用して(キーを押す、マウスを動かすなどの)いくつかのキーイベントを取得し、それらをアプリケーションイベントループに送ることができます。それは醜いですが、それは仕事を完了するかもしれません。 messageMSGに静的キャストすることができ、Windows上で

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

QCoreApplication::setEventFilterは、次のシグネチャを持つ関数を受け取ります。私のWindows APIの知識は多少錆びていますが、関連するイベントを見つけるのは難しいことではありません。

私はこの解決策を深く嫌うことを強調する必要があります。私は心からQtを使わずにプラグインを書きました。しかし、たとえ非常に醜い方法であってもうまくいくはずです。

+0

フィードバックに感謝します。私はこれを調査し、私のサンプルアプリケーションで動作しました(QApplicationの代わりにQAbstractEventDispatcherインスタンスでフィルタを設定する必要がありましたが)。言うまでもなく、プロダクション環境はかなり複雑です.2つのイベントループを別々のスレッドで実行する必要がありました(2つのアプリケーション間の通信には細心の注意が必要です)。ありがとう。 – Robin

+0

@Robin何もありません。また、新しいQtコードとMFCレガシーアプリケーションを統合する方法についても説明しました。この種の解決策の問題は、単一のイベントループのようなQtの施設に違反し、非常に微妙で追跡が難しいバグを生成する可能性があることです。とにかく、現実世界の問題には現実世界の解決策が必要です。がんばろう :) –

0

QtWinMigrateは、この問題の正しい解決方法です。これは、Win32またはMFCイベントループの問題でQtを解決します。変更する必要はありません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; 
} 
関連する問題