Поиск стороннего QWidget с помощью введенного кода и QWidget::find(hwnd)

StackOverflow https://stackoverflow.com/questions/1173740

Вопрос

У меня есть 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 и в вашем коде.Особенно.если один из них связан статически, то может существовать два его экземпляра, каждый со своим собственным, непересекающимся набором виджетов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top