2009-07-23 16 views
7

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

+0

你能步入`QWidget的:: find()`与调试器,并查看`QWidgetPrivate :: mapper`是否为`NULL`或不? – Paul 2009-07-25 13:16:29

+0

QWidget :: find()在CBT_Proc回调函数中,并且在那里似乎没有一个断点......是否有任何其他验证方法?如果它是NULL,那么我该怎么做? – 2009-07-27 15:27:38

+0

如果你想知道“他怎么知道代码被执行了?”,我正在控制台中打印。 – 2009-07-27 15:33:51

回答

2

回答:

愚蠢的错误,我在编译调试,所以这是QtGui4d.dll和QtCore4d.dll但如量没有QtCore4.dll和QtGui.dll

0

比较QWidgetPrivate :: mapper在DLL和代码中的地址。 ESP。如果静态链接,则可能有两个实例,每个实例都有自己的不相交的小部件集。