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.