2009-07-23 9 views
7

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.

+0

Puede usted entrar en 'QWidget :: find() 'con depurador y ver si' QWidgetPrivate :: mapper' es 'NULL' o no? – Paul

+0

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? –

+0

En caso de que se pregunte "¿Cómo sabe que el código se ejecuta entonces?", Estoy imprimiendo en la consola. –

Respuesta

2

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

+0

David, ¿podría enviarme un correo electrónico, [email protected]? Tengo algunas preguntas con respecto a esto, ya que estoy tratando de hacer algo similar y estoy atascado. Gracias. – flavour404

0

Compare las direcciones de `QWidgetPrivate :: mapper en la DLL y en su código. Esp. si uno está vinculado estáticamente, puede haber dos instancias de él, cada uno con su propio conjunto de widgets disjuntos.

+0

¿qué quiere decir en el DLL y en mi código? el DLL es mi código –

Cuestiones relacionadas