2009-07-23 15 views
7

J'ai un Wich Qt dll j'injecte dans une application tierce utilisant des fenêtres Detours bibliothèque:Trouver un QWidget 3ème partie avec le code injecté et 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)) 

puis-je définir un crochet échelle du système pour intercepter la création de la fenêtre:

HHOOK h_hook = ::SetWindowsHookEx(WH_CBT, (HOOKPROC)CBTProc, Status::getInstance()->getXORInstance(), 0); 

où XOR est mon nom de programmes, et le statut :: getInstance() est un Singleton où je garde globals.

Dans mon rappel CBTProc, je veux intercepter toutes les fenêtres qui sont QWidgets:

HWND hwnd= FindWindow(L"QWidget", NULL); 

qui fonctionne bien, puisque je reçois un HWND correspondant (j'ai vérifié avec Spy ++) Ensuite, je veux obtenir un pointeur vers le QWidget, afin que je puisse utiliser ses fonctions:

QWidget* q = QWidget::find(hwnd); 

mais voici le problème, le pointeur de retour est toujours 0. Suis-je pas injecter mon code dans le processus correctement? Ou est-ce que je n'utilise pas QWidget :: find() comme je devrais?

Merci,

Dave

EDIT: Si je change la fonction QWidget :: find() à une fonction exportée de ma DLL, après avoir réglé les crochets (je peux régler et prendre un point d'arrêt) , QWidgetPrivate :: mapper est NULL.

+0

Pouvez-vous entrer dans 'QWidget :: find() 'avec le débogueur et vérifie si' QWidgetPrivate :: mapper' est 'NULL' ou non? – Paul

+0

QWidget :: find() est dans le rappel CBT_Proc et un point d'arrêt ne semble pas pouvoir être touché ... y a-t-il un autre moyen de vérifier cela? et si c'est NULL, que faire alors? –

+0

Si vous vous demandez "Comment sait-il que le code est exécuté alors?", J'imprime dans la console. –

Répondre

2

Answered:

erreur stupide, je compilait dans Debug, il était donc QtGui4d.dll et QtCore4d.dll que lorsque le chargement, pas QtCore4.dll et QtGui.dll

+0

David, pourriez-vous m'envoyer un email, [email protected] J'ai quelques questions à ce sujet car j'essaie de faire quelque chose de similaire et je suis coincé. Merci. – flavour404

0

Comparez les adresses de `QWidgetPrivate :: mapper dans la DLL et dans votre code. Esp. si on est lié statiquement, il peut y en avoir deux instances, chacune avec son propre, disjoint, ensemble de widgets.

+0

que voulez-vous dire dans la DLL et dans mon code? la DLL est mon code –