Trovare un QWidget 3rd party con il codice iniettato e QWidget :: trovare (hwnd)
-
19-09-2019 - |
Domanda
Ho un wich Qt Dll faccio l'iniezione in un'applicazione di terze parti utilizzando finestre deviazioni libreria:
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))
e poi a impostare un hook al livello di sistema per intercettare creazione finestra:
HHOOK h_hook = ::SetWindowsHookEx(WH_CBT, (HOOKPROC)CBTProc, Status::getInstance()->getXORInstance(), 0);
Dove XOR è il mio nome programmi e Stato :: getInstance () è un Singleton dove tengo globali.
Nel mio CBTProc callback, voglio intercettare tutte le finestre che sono QWidgets:
HWND hwnd= FindWindow(L"QWidget", NULL);
che funziona bene, dal momento che ho un corrispondente HWND (ho controllato con Spy ++) Poi, voglio ottenere un puntatore alla QWidget, in modo da poter utilizzare le sue funzioni:
QWidget* q = QWidget::find(hwnd);
Ma ecco il problema, il puntatore restituito è sempre 0. Non sono io iniettare il mio codice nel processo in modo corretto? O non sono io usando QWidget :: find () come dovrei?
Grazie,
Dave
EDIT: Se cambio la QWidget :: trovare la funzione () per una funzione esportata della mia DLL, dopo aver impostato i ganci (in modo da poter impostare e prendere un punto di interruzione), QWidgetPrivate :: mapper è NULL
.Soluzione
Risposta:
errore stupido, ero compilazione in Debug, quindi è stato QtGui4d.dll e QtCore4d.dll che, qualora il carico, non QtCore4.dll e QtGui.dll
Altri suggerimenti
Confronto gli indirizzi dei `QWidgetPrivate :: mapper nella DLL e nel codice. Esp. se uno è collegato in modo statico, ci potrebbero essere due istanza di esso, ciascuna con il proprio, disgiunti, set di widget.