我有一个 Qt Dll,我使用 windows detours 库将其注入第三方应用程序:
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))
然后我设置了一个系统范围的钩子来拦截窗口的创建:
HHOOK h_hook = ::SetWindowsHookEx(WH_CBT, (HOOKPROC)CBTProc, Status::getInstance()->getXORInstance(), 0);
XOR 是我的程序名称,而 Status::getInstance() 是一个单例,我在其中保存全局变量。
在我的 CBTProc 回调中,我想拦截所有属于 QWidgets 的窗口:
HWND hwnd= FindWindow(L"QWidget", NULL);
效果很好,因为我得到了相应的 HWND(我用 Spy++ 检查)然后,我想获得一个指向 QWidget 的指针,所以我可以使用它的函数:
QWidget* q = QWidget::find(hwnd);
但问题是,返回的指针始终为 0。我没有正确地将代码注入进程吗?还是我没有按我应该的方式使用 QWidget::find() ?
谢谢,
戴夫
编辑:如果我将 QWidget::find() 函数更改为我的 DLL 的导出函数,在设置挂钩后(以便我可以设置和捕获断点),QWidgetPrivate::mapper 为 NULL。