我有一个Qt Dll,我使用Windows绕道库注入第三方应用程序:
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()是一个Singleton,我保持全局变量。
在我的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。
答案 0 :(得分:2)
已经回答了:
愚蠢的错误,我在Debug中编译,所以QtGui4d.dll和QtCore4d.dll在哪里加载,而不是QtCore4.dll和QtGui.dll
答案 1 :(得分:0)
比较DLL和代码中`QWidgetPrivate :: mapper的地址。 ESP。如果一个是静态链接的,那么它可能有两个实例,每个实例都有它自己的,不相交的小部件组。