2009-07-23 5 views
7

Ich habe eine wich Qt Dll ich in ein Drittanbieter-Anwendung injizieren Fenster mit Umwege Bibliothek:eine 3rd-Party QWidget mit injizierte Code & QWidget :: find (hwnd) Finding

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)) 

und dann stelle ich ein systemweite Haken Fenstererstellung abfangen:

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

wo XOR meine Programme Name und Status-:: getInstance() ist ein Singleton, wo ich Globals halten.

In meinem CBTProc Rückruf, ich will alle Fenster abzufangen, die QWidgets sind:

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

, die gut funktioniert, da ich einen entsprechenden HWND (Ich habe mit Spy ++) Dann bekommen, ich möchte bekommen Zeiger auf die QWidget, so kann ich seine Funktionen nutzen:

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

aber hier ist das Problem, ist der zurückgegebene Zeiger immer 0. ist ich meinen Code in den Prozess nicht ordnungsgemäß injizieren? Oder verwende ich QWidget :: find() nicht wie ich sollte?

Danke,

Dave

EDIT: Wenn ich die QWidget ändern :: find() Funktion zu einer exportierten Funktion meiner DLL, nachdem die Haken Einstellung (so kann ich und einen Haltepunkt fangen) , QWidgetPrivate :: mapper ist NULL.

+0

Können Sie sollte in 'QWidget :: find() 'mit Debugger und sehen, ob' QWidgetPrivate :: mapper' 'NULL' ist oder nicht? – Paul

+0

QWidget :: find() ist in der CBT_Proc Callback und ein Haltepunkt kann nicht scheinen dort getroffen werden ... Gibt es eine andere Möglichkeit, dies zu überprüfen? und wenn es NULL ist, was mache ich dann? –

+0

Wenn Sie sich fragen, "Woher weiß er, dass der Code dann ausgeführt wird?", Drucke ich in der Konsole. –

Antwort

2

Beantwortet:

dummer Fehler, ich war in Debug kompilieren, so dass es QtGui4d.dll und QtCore4d.dll war, dass in dem Laden, nicht QtCore4.dll und QtGui.dll

+0

David, könntest du mir eine E-Mail schicken, [email protected] Ich habe ein paar Fragen dazu, da ich versuche, etwas Ähnliches zu tun und feststecken. Vielen Dank. – flavour404

0

Vergleichen Sie die Adressen von `QWidgetPrivate :: Mapper in der DLL und in Ihrem Code. Esp. Wenn man statisch verknüpft ist, kann es zwei Instanzen geben, jede mit eigenen, disjunkten Widgets.

+0

was meinst du in der DLL und in meinem Code? Die DLL ist mein Code –