Die Suche nach einer dritten Partei QWidget mit injizierte Code & QWidget :: find (hwnd)
-
19-09-2019 - |
Frage
Ich habe ein Qt Dll weicht ich in eine Drittanbieter-Anwendung zu injizieren mit Windows Umwegen Bibliothek:
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 stelle ich eine systemweite Haken Fenstererstellung abfangen:
HHOOK h_hook = ::SetWindowsHookEx(WH_CBT, (HOOKPROC)CBTProc, Status::getInstance()->getXORInstance(), 0);
Wo XOR meine Programme Name und Status-:: getInstance () ist ein Singleton, wo ich Globals halten.
In meinem CBTProc Rückruf, ich will alle Fenster abfängt, die QWidgets sind:
HWND hwnd= FindWindow(L"QWidget", NULL);
, die gut funktioniert, da ich einen entsprechenden HWND (Ich habe mit Spy ++) erhalten Dann möchte ich einen Zeiger auf die QWidget bekommen, so kann ich seine Funktionen zur Verfügung:
QWidget* q = QWidget::find(hwnd);
, aber hier ist das Problem, der zurückgegebene Zeiger immer 0. Am ist ich nicht richtig meinen Code in den Prozess Injektion? Oder bin ich nicht QWidget mit :: find (), wie ich sollte?
Danke,
Dave
EDIT: Wenn ich die QWidget ändern :: find () Funktion zu einer exportierten Funktion meiner DLL, nachdem die Haken Einstellung (so kann ich und einen Haltepunkt fangen), QWidgetPrivate :: Mapper ist NULL
.Lösung
Beantwortet:
dummer Fehler, ich war in Debug kompilieren, so war es QtGui4d.dll und QtCore4d.dll dass dort, wo Laden, nicht QtCore4.dll und QtGui.dll
Andere Tipps
Vergleichen Sie die Adressen von `QWidgetPrivate :: Mapper in der DLL und in Ihrem Code. Esp. wenn man statisch verknüpft ist, könnte es zwei Instanz davon sein, die jeweils mit einer eigenen, separaten, Satz von Widgets.