Есть приложение, состоящее из нескольких dll. Т.е., например, одно окно находится в одной dll, другое в другой.
Я знаю только хэндл окна. Можно ли определить хэндл dll по хэндлу окна?
Здравствуйте, StillZero, Вы писали:
SZ>Есть приложение, состоящее из нескольких dll. Т.е., например, одно окно находится в одной dll, другое в другой. SZ>Я знаю только хэндл окна. Можно ли определить хэндл dll по хэндлу окна?
Можно попробовать GetWindowLong(hWnd, GWL_HINSTANCE). Я, честно говоря, не совсем уверен какой именно HINSTANCE она возвращает.
Здравствуйте, Alex Fedotov, Вы писали:
AF>Здравствуйте, StillZero, Вы писали:
SZ>>Есть приложение, состоящее из нескольких dll. Т.е., например, одно окно находится в одной dll, другое в другой. SZ>>Я знаю только хэндл окна. Можно ли определить хэндл dll по хэндлу окна?
AF>Можно попробовать GetWindowLong(hWnd, GWL_HINSTANCE). Я, честно говоря, не совсем уверен какой именно HINSTANCE она возвращает.
GWL_HINSTANCE
Retrieves a handle to the application instance.
ИМХО вопрос не очень корректно сформулирован. Окна принадлежат потоку, а не DLL.
Вопрос можно понимать двояко
1. Где находится оконная функция — в какой DLL или в EXE
2. Откуда был вызов CreateWindow — из какой DLL или EXE
Если понимать первое — все очень просто. Определяем адрес оконной функции GetWindowLong(GWL_WNDPROC) и находим DLL, которой принадлежит этот адрес (например, методом Рихтера, пример VMQuery). Разумеется, это будет работать, если не было сабклассинга, но при сабклассинге сам вопрос расплывается и становится неопределенным.
Кстати, любопытный вопрос. Как определить, что окно было сабклассировано, и найти всю цепочку сабклассинга ? У меня ответа нет. Сравнивать GetWindowLong(GWL_WNDPROC) и GetClassLong(GCL_WNDPROC) не имеет смысла — сабклассирование могло быть на уровне класса тоже.
Если понимать второе — сложнее. Хотя и трудно представить себе, что кто-то будет из A.DLL создавать окно, оконная функция которого лежит в B.DLL, но теоретически такое не исключено. В этом случае ИМХО остается только локально перехватить вызовы CreateWindowExA и/или CreateWindowExW . Если же окно уже создано — ИМХО ответа нет. Как можно определить, откуда вызывалась функция давным-давно ?