我有一个Qt的Dll至极我注入使用Windows第三方应用第三方QWidget的弯路库:找到与注入的代码和QWidget的::发现(HWND)
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是我的程序名称,状态::的getInstance()是一个Singleton,我保持全局。
在我CBTProc回调,我想拦截的QWidgets所有窗口:
HWND hwnd= FindWindow(L"QWidget", NULL);
效果很好,因为我得到了相应的HWND (我与间谍++检查)然后,我希望得到一个指针QWidget的,这样我就可以使用它的功能:
QWidget* q = QWidget::find(hwnd);
但这里的问题,返回的指针始终是0。我不能注入我的代码到工艺不当?或者我不应该使用QWidget :: find()吗?
感谢,
戴夫
编辑:如果我改变了QWidget ::找到()函数来我的DLL的导出函数,设置挂机后(这样我就可以设置和捕捉断点) ,QWidgetPrivate :: mapper是NULL。
你能步入`QWidget的:: find()`与调试器,并查看`QWidgetPrivate :: mapper`是否为`NULL`或不? – Paul 2009-07-25 13:16:29
QWidget :: find()在CBT_Proc回调函数中,并且在那里似乎没有一个断点......是否有任何其他验证方法?如果它是NULL,那么我该怎么做? – 2009-07-27 15:27:38
如果你想知道“他怎么知道代码被执行了?”,我正在控制台中打印。 – 2009-07-27 15:33:51