Tengo un wich Qt DLL me inyecto en una aplicación de terceros usando ventanas desvíos de biblioteca:Encontrar una tercera parte QWidget con código inyectado y QWidget :: find (hwnd)
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 puse una de todo el sistema de gancho 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 conseguir una 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 estoy usando QWidget :: find() como debería?
Gracias,
de Dave
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 :: mapper es NULL.
Puede usted entrar en 'QWidget :: find() 'con depurador y ver si' QWidgetPrivate :: mapper' es 'NULL' o no? – Paul
QWidget :: find() está en la devolución de llamada CBT_Proc y parece que no se puede alcanzar un punto de interrupción allí ... ¿hay alguna otra forma de verificar esto? y si es NULL, ¿qué hago entonces? –
En caso de que se pregunte "¿Cómo sabe que el código se ejecuta entonces?", Estoy imprimiendo en la consola. –