Encontrar una tercera parte QWidget con código inyectado y QWidget :: find (hwnd)
-
19-09-2019 - |
Pregunta
Tengo un wich Qt DLL me inyecto en una aplicación de terceros usando ventanas desvíos de biblioteca:
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))
y luego establecer un enlace de todo el sistema para interceptar creación de la ventana:
HHOOK h_hook = ::SetWindowsHookEx(WH_CBT, (HOOKPROC)CBTProc, Status::getInstance()->getXORInstance(), 0);
Donde XOR es mi nombre de programas y Estado :: getInstance () es un Singleton donde guardo globales.
En mi devolución de llamada CBTProc, quiero interceptar todas las ventanas que están QWidgets:
HWND hwnd= FindWindow(L"QWidget", NULL);
que funciona bien, ya que me sale un correspondiente HWND (he comprobado con Spy ++) Entonces, quiero obtener un puntero a la QWidget, para que pueda utilizar sus funciones:
QWidget* q = QWidget::find(hwnd);
Pero aquí está el problema, el puntero devuelto es siempre 0. No soy yo la inyección de mi código en el proceso correctamente? O no soy yo usando QWidget :: find () como debería?
Gracias,
David
EDIT: Si cambio la QWidget :: find () para una función exportada de mi DLL, después de ajustar los ganchos (para poder establecer y coger un punto de interrupción), QWidgetPrivate :: asignador es NULL
.Solución
Respondido:
error estúpido, estaba recopilando en la depuración, por lo que fue QtGui4d.dll y QtCore4d.dll que donde la carga, no QtCore4.dll y QtGui.dll
Otros consejos
Comparación de las direcciones de `QWidgetPrivate :: asignador en el DLL y en el código. Percepción extrasensorial. si uno está vinculado estáticamente, puede haber dos instancias de la misma, cada uno con su propia, disjuntos, un conjunto de widgets.