I have a Qt Dll that I inject into a third-party application using the window crawl library:
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))
and then I set a system-wide hook to intercept window creation:
HHOOK h_hook = ::SetWindowsHookEx(WH_CBT, (HOOKPROC)CBTProc, Status::getInstance()->getXORInstance(), 0);
Where XOR is my program name, and Status :: getInstance () is Singleton, where I save global variables.
In my CBTProc callback, I want to intercept all windows that are QWidgets:
HWND hwnd= FindWindow(L"QWidget", NULL);
which works well, since I get the corresponding HWND (I checked with Spy ++) Then I want to get a pointer to QWidget, so I can use its functions:
QWidget* q = QWidget::find(hwnd);
but here is the problem, the returned pointer is always 0. Have I entered the code incorrectly in this process? Or am I not using QWidget :: find () as it should?
Thanks,
Dave
EDIT: If I changed the QWidget :: find () function to an exported function of my DLL, after setting the hooks (so that I could set and catch a breakpoint), QWidgetPrivate :: mapper is NULL.
qt dll code-injection hook qwidget
David menard
source share