2009-07-23 4 views
7

У меня есть Wich Qt Dll я впрыснуть в третьей стороне заявку с использованием окна объездов библиотеки:Поиск 3 участника 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 мое имя программы, и статус :: деЫпзЬапс() является Singleton, где я держу глобал.

В моей CBTProc обратный вызов, я хочу, чтобы перехватывать все окна, которые QWidgets:

HWND hwnd= FindWindow(L"QWidget", NULL); 

, который хорошо работает, так как я получаю соответствующий HWND (я проверил с Spy ++) Тогда, я хочу, чтобы получить указатель на QWidget, так что я могу использовать свои функции:

QWidget* q = QWidget::find(hwnd); 

, но вот проблема, возвращаемый указатель всегда равен 0. может ли я не инъекционная свой код в процесс правильно? Или я не использую QWidget :: find(), как должен?

Спасибо,

Dave

EDIT: Если я изменить QWidget :: найти() для экспортируемой функции моей DLL, после установки крюков (так что я могу установить и поймать точку останова) , QWidgetPrivate :: mapper - NULL.

+0

Можете ли вы шаг в 'QWidget :: find() 'с отладчиком и посмотреть, является ли' QWidgetPrivate :: mapper' 'NULL' или нет? – Paul

+0

QWidget :: find() находится в обратном вызове CBT_Proc, и точка останова не может попасть туда ... есть ли другой способ проверить это? и если это NULL, что мне тогда делать? –

+0

В случае, если ваше задание «Как он знает, что код будет выполнен?», Я печатаю на консоли. –

ответ

2

Ответил:

Глупая ошибка, я компиляции в Debug, так что это было QtGui4d.dll и QtCore4d.dll что там, где нагрузка, не QtCore4.dll и QtGui.dll

+0

Дэвид, не могли бы вы мне написать по электронной почте, [email protected] У меня есть некоторые вопросы относительно этого, поскольку я пытаюсь сделать что-то подобное и застрял. Благодарю. – flavour404

0

Сравните адреса `QWidgetPrivate :: mapper в DLL и в вашем коде. Особенно если один из них связан статически, может быть два экземпляра, каждый из которых имеет свой собственный, непересекающийся, набор виджетов.

+0

Что вы имеете в виду в DLL и в моем коде? DLL - это мой код –

Смежные вопросы