Чем отличается FromHandle от FromHandlePermanent
От: rus blood Россия  
Дата: 09.03.05 11:34
Оценка: 10 (1)
#Имя: FAQ.mfc.fromhandlepermanent
Здравствуйте, tchernov, Вы писали:

T>Здравствуйте, sam_daemon, Вы писали:


_>>Вот у меня в связи с этим вопрос а можно ли все же получить объект используя его хэндлер. Например получить указатель на CView из дочернего потока???


T>Объект получить нельзя, но это и не нужно. Проблема заключается в том, что не безопасно пользоваться методами объекта (как инстанса какого-либо класса), если эти методы не трэдсэйф. Но никто не мешает создать другой инстанс в нужно трэде и приаттачить его к существующим данным (через хендл) — ведь именно данные и нужны. Для любого класса, унаследованного от CWnd (а CView и есть таковой), можно вызвать FromHandlePermanent, передавая ему HWND твоего вья из другого потока. После этого ты получишь объект CView, связанный с нужным виндовым окном.


Не вводите в заблуждение, плз.
permanent от не permanent отличается вовсе не этим.

В каждом потоке есть свой мап hwnd->объект. Когда создаешь окно CWnd, оно кладется в этот мап как permanent-ный айтем.

Когда ты по HWND пытаешься получить объект вызывая FromHandle, и в мапе данного потока объект не найден, создается временный объект. Эти временные объекты будут уничтожены во время вызова DeleteTempMap, кажется он вызывается в idle-обработчике MFC.

Т.о. отличие FromHandle от FromHandlePermanent заключается в том, что если в мапе данного потока объект на зарегистрирован (грубя говоря, создан в другом потоке), то первая возвращает временный объект, тогда как вторая возвращает NULL.
Имею скафандр — готов путешествовать!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.