hInstance по hWnd
От: StillZero Россия  
Дата: 27.04.05 21:57
Оценка:
Здравствуйте.

Есть приложение, состоящее из нескольких dll. Т.е., например, одно окно находится в одной dll, другое в другой.
Я знаю только хэндл окна. Можно ли определить хэндл dll по хэндлу окна?

Спасибо.
Re: hInstance по hWnd
От: Alex Fedotov США  
Дата: 27.04.05 23:41
Оценка:
Здравствуйте, StillZero, Вы писали:

SZ>Есть приложение, состоящее из нескольких dll. Т.е., например, одно окно находится в одной dll, другое в другой.

SZ>Я знаю только хэндл окна. Можно ли определить хэндл dll по хэндлу окна?

Можно попробовать GetWindowLong(hWnd, GWL_HINSTANCE). Я, честно говоря, не совсем уверен какой именно HINSTANCE она возвращает.
-- Alex Fedotov
Re[2]: hInstance по hWnd
От: Pavel Dvorkin Россия  
Дата: 28.04.05 04:20
Оценка:
Здравствуйте, 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 . Если же окно уже создано — ИМХО ответа нет. Как можно определить, откуда вызывалась функция давным-давно ?
With best regards
Pavel Dvorkin
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.