2009-07-23 9 views
7

Ho un wich Qt Dll faccio l'iniezione in un'applicazione di terze parti utilizzando finestre deviazioni libreria:Trovare un QWidget 3rd party con il codice iniettato e QWidget :: trovare (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)) 

e poi ho impostare un a livello di sistema per intercettare gancio 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 al QWidget, in modo da poter utilizzare le sue funzioni:

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

ma qui è il problema, il puntatore restituito è sempre 0. non sono io iniettare il mio codice nel processo in modo corretto? O non sto usando QWidget :: find() come dovrei?

Grazie,

Dave

EDIT: Se cambio la QWidget :: trovare() 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.

+0

Can you entrare in 'QWidget :: find() 'con debugger e vedere se' QWidgetPrivate :: mapper' è 'NULL' o no? – Paul

+0

QWidget :: find() è nel callback CBT_Proc e un punto di interruzione non può sembrare essere colpito lì ... c'è qualche altro modo per verificarlo? e se è NULL, cosa faccio allora? –

+0

Nel caso in cui ti chiedessi "Come fa a sapere che il codice viene eseguito allora?", Sto stampando nella console. –

risposta

2

risposto:

errore stupido, ero compilazione in Debug, quindi è stato QtGui4d.dll e QtCore4d.dll che, qualora il carico, non QtCore4.dll e QtGui.dll

+0

David, potresti mandarmi una email, [email protected] Ho alcune domande su questo perché sto cercando di fare qualcosa di simile e mi sto bloccando. Grazie. – flavour404

0

Confrontare gli indirizzi di `QWidgetPrivate :: mapper nella DLL e nel codice. Esp. se uno è collegato staticamente, potrebbero esserci due istanze, ognuna con il proprio, disgiunto, insieme di widget.

+0

cosa intendi nella DLL e nel mio codice? la DLL è il mio codice –