7

Windows detours ライブラリを使用してサードパーティのアプリケーションに挿入する Qt Dll があります。

if(!DetourCreateProcessWithDll( Path, NULL, NULL, NULL, TRUE, 
                                CREATE_DEFAULT_ERROR_MODE | CREATE_SUSPENDED, NULL, NULL,
                                &si, &pi, "C:\\Program Files\\Microsoft Research\\Detours Express 2.1\\bin\\detoured.dll",
                                "C:\\Users\\Dave\\Documents\\Visual Studio 2008\\Projects\\XOR\\Debug\\XOR.dll", NULL))

次に、システム全体のフックを設定して、ウィンドウの作成をインターセプトします。

HHOOK h_hook = ::SetWindowsHookEx(WH_CBT, (HOOKPROC)CBTProc, Status::getInstance()->getXORInstance(), 0);

XOR はプログラム名で、Status::getInstance() はグローバルを保持するシングルトンです。

私の CBTProc コールバックでは、QWidgets であるすべてのウィンドウをインターセプトしたいと考えています。

HWND hwnd= FindWindow(L"QWidget", NULL);

対応する HWND を取得するので (Spy++ で確認しました)、うまく機能します。次に、QWidget へのポインターを取得したいので、その関数を使用できます。

QWidget* q = QWidget::find(hwnd);

しかし、ここに問題があります。返されるポインターは常に 0 です。コードをプロセスに正しく挿入していませんか? それとも QWidget::find() を使用していませんか?

ありがとう、

デイブ

編集: QWidget::find() 関数を DLL のエクスポートされた関数に変更すると、フックを設定した後 (ブレークポイントを設定してキャッチできるようになります)、QWidgetPrivate::mapper は NULL になります。

4

2 に答える 2

2

回答済み:

愚かな間違い、私はデバッグでコンパイルしていたので、QtCore4.dllとQtGui.dllではなく、QtGui4d.dllとQtCore4d.dllがロードされていました

于 2009-07-27T20:14:26.887 に答える
0

DLL とコード内の `QWidgetPrivate::mapper のアドレスを比較します。特に。1 つが静的にリンクされている場合、2 つのインスタンスが存在し、それぞれが独自のばらばらなウィジェットのセットを持っている可能性があります。

于 2009-07-26T10:39:54.700 に答える