7

我有一个 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。

4

2 回答 2

2

回答:

愚蠢的错误,我在Debug中编译,所以加载的是QtGui4d.dll和QtCore4d.dll,而不是QtCore4.dll和QtGui.dll

于 2009-07-27T20:14:26.887 回答
0

比较 DLL 和代码中的 `QWidgetPrivate::mapper 的地址。特别是。如果一个是静态链接的,则可能有它的两个实例,每个实例都有它自己的、不相交的一组小部件。

于 2009-07-26T10:39:54.700 回答