7 Stimmen

Auffinden eines QWidget eines Drittanbieters mit injiziertem Code & QWidget::find(hwnd)

Ich habe eine Qt Dll, die ich in eine Drittanbieter-Anwendung mit Windows Umwege Bibliothek injizieren:

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))

und dann habe ich einen systemweiten Haken gesetzt, um die Fenstererstellung abzufangen:

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

XOR ist der Name meines Programms, und Status::getInstance() ist ein Singleton, in dem ich Globals aufbewahre.

In meinem CBTProc-Callback möchte ich alle Windows abfangen, die QWidgets sind:

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

was gut funktioniert, da ich ein entsprechendes HWND erhalte (ich habe es mit Spy++ überprüft) Dann möchte ich einen Zeiger auf das QWidget erhalten, damit ich seine Funktionen nutzen kann:

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

aber hier ist das Problem, der zurückgegebene Zeiger ist immer 0. Füge ich meinen Code nicht richtig in den Prozess ein? Oder verwende ich QWidget::find() nicht so, wie ich es sollte?

Merci,

Dave

EDIT: Wenn ich die QWidget::find() Funktion zu einer exportierten Funktion meiner DLL ändere, nachdem ich die Hooks gesetzt habe (damit ich einen Haltepunkt setzen und abfangen kann), ist QWidgetPrivate::mapper NULL.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X