Как я могу создать окно (HWND) без использования CreateWindow (Ex)? - PullRequest
10 голосов
/ 19 мая 2011

Я использую прокси DLL для перехвата вызовов на CreateWindowExA / CreateWindowExW. Это хорошо работает, за исключением того, что некоторые приложения (особенно некоторые из приложений Visual Basic 6), похоже, могут создавать окна, не выполняя ни одну из двух функций. Такие инструменты, как Spy ++ , могут отображать окно, но мои подключенные функции их не заметили.

Моим первым подозрением было то, что, возможно, эти (старые) приложения используют CreateWindowA / CreateWindowW для создания окон, но по крайней мере с моими компиляторами (MSVC6 до MSVC10), CreateWindow это просто #define; раздел примечаний документации подтверждает это.

Моя вторая идея заключалась в том, что я мог бы установить CBT hook, используя SetWindowsHookEx для обнаружения созданий окон. Тем не менее, результат тот же: этот хук замечает те же окна, что и мои перехваченные функции API, но он не замечает все окна, которые видны в Spy ++.

Итак, мой вопрос: было ли время, когда CreateWindowA / CreateWindowW был не #define, а реальной функцией? Эта функция все еще экспортируется в user32.dll, возможно, из соображений совместимости? Как я могу получить дескриптор этой функции, чтобы подключить ее?

Или есть какая-то другая, возможно недокументированная, функция, которую можно использовать для создания функций, например, например, NtCreateProcess может использоваться вместо CreateProcess?

Ответы [ 2 ]

7 голосов
/ 19 мая 2011

Три простых предположения:

1) Возможно ли, что приложения VB действительно вызывают API DialogBox (например, DialogBoxParam, CreateDialogIndirect и т. Д.) Под капотом?

2) Вы работаете в 64-битной ОС и подключаете 64-битную user32.dll.32-битные приложения не зацепляются в результате.В c: \ windows \ syswow64

есть 32-битная копия user32.dll. 3) Вы не перехватываете user32.dll, который используют приложения.Многие старые приложения могут получать перенаправление DLL.Из командной строки выполните «dir / s user32.dll» из каталога c: \ windows \ winsxs.Вы увидите по крайней мере еще одну копию user32.dll здесь.Забудьте, когда это произойдет, но вы можете использовать Bing для «winsxs» и обсудить на нескольких страницах, как параллельный каталог решает проблемы совместимости в новых выпусках ОС Windows.

Я подозреваю, что причиной вашей проблемы является №3.

1 голос
/ 13 сентября 2012

Я думаю, что ваша проблема может быть в том, что приложение VB использует GetProcAddress () для вызова функции CreateWindow ** (). Если вы перехватите GetProcAddress, вы сможете это подтвердить.

...