Поиск стороннего QWidget с помощью введенного кода и QWidget::find(hwnd)
-
19-09-2019 - |
Вопрос
У меня есть 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() - это синглтон, в котором я сохраняю глобальные значения.
В моем обратном вызове CBTProc я хочу перехватить все окна, которые являются QWidgets:
HWND hwnd= FindWindow(L"QWidget", NULL);
который работает хорошо, так как я получаю соответствующий HWND (я проверил с помощью Spy ++) Затем я хочу получить указатель на QWidget, чтобы я мог использовать его функции:
QWidget* q = QWidget::find(hwnd);
но вот проблема, возвращаемый указатель всегда равен 0.Разве я неправильно внедряю свой код в процесс?Или я не использую QWidget::find(), как следовало бы?
Спасибо,
Дэйв
РЕДАКТИРОВАТЬ: Если я изменю функцию QWidget::find() на экспортированную функцию моей библиотеки DLL, после установки перехватов (чтобы я мог установить и перехватить точку останова), QWidgetPrivate::mapper будет равен НУЛЮ.
Решение
Ответил:
Глупая ошибка, я компилировал в Debug, так что это был QtGui4d.dll и QtCore4d.dll вот где загрузка, а не QtCore4.dll и QtGui.dll
Другие советы
Сравните адреса 'QWidgetPrivate::mapper в DLL и в вашем коде.Особенно.если один из них связан статически, то может существовать два его экземпляра, каждый со своим собственным, непересекающимся набором виджетов.