Продолжительность существования Handle
От: v14d  
Дата: 18.10.07 04:43
Оценка:
Я где-то читал что Handle окна возвращаемый некоторыми функциями нельзя использовать на продолжительное время.
Теперь я не могу найти где это я читалб по моему в MSDN. И я начал сомневаться в этом. Мне интересно так это на самом деле или нет? И если это так, то в каких случаях Windows меняет Handle окна.
Проблема в следующем, мне нужно хранить Handle некоторого приложения в протяжении всего его существования (от запуска до закрытия), и чуть ли не существования системы, потому что это приложение запускается почти что вместе с системой (скажем так, компьютер включают только ради него).
Конечно можно получать Handle каждый раз при помощи FindWindow, но дело в том что заголовок окна этого приложения все время меняется, хотя часть этого заголовка остается неизменным.
Re: Продолжительность существования Handle
От: Leonid Troyanovsky  
Дата: 18.10.07 04:58
Оценка:
Здравствуйте, v14d, Вы писали:

V>Проблема в следующем, мне нужно хранить Handle некоторого приложения в протяжении всего его существования (от запуска до закрытия), и чуть ли не существования системы, потому что это приложение запускается почти что вместе с системой (скажем так, компьютер включают только ради него).


Поставь на поток, владеющий этим окном хук WH_CALLWNDPROC*,
тогда при разрушении окна можно реагировать на WM_DESTROY.
--
С уважением, LVT
Re: Продолжительность существования Handle
От: Pavel Dvorkin Россия  
Дата: 18.10.07 06:51
Оценка:
Здравствуйте, v14d, Вы писали:

V>Я где-то читал что Handle окна возвращаемый некоторыми функциями нельзя использовать на продолжительное время.

V>Теперь я не могу найти где это я читалб по моему в MSDN. И я начал сомневаться в этом. Мне интересно так это на самом деле или нет? И если это так, то в каких случаях Windows меняет Handle окна.
V>Проблема в следующем, мне нужно хранить Handle некоторого приложения в протяжении всего его существования (от запуска до закрытия), и чуть ли не существования системы, потому что это приложение запускается почти что вместе с системой (скажем так, компьютер включают только ради него).
V>Конечно можно получать Handle каждый раз при помощи FindWindow, но дело в том что заголовок окна этого приложения все время меняется, хотя часть этого заголовка остается неизменным.

Дескриптор окна не меняется в течение всего времени существования окна. Доказательство элементарно. Создаем окно

hWnd = CreateWindow(...);

Если теперь в моей программе вдруг ни с того ни с сего окажется, что у этого окна другой дескриптор — все, я отказываюсь писать программы для Windows

А читал ты, скорее всего, вот что. Утверждать, что если дескриптор не изменился, то это то же самое окно, нельзя. Потому что оно могло быть уничтожено и создано новое, случайно с тем же дескриптором.
With best regards
Pavel Dvorkin
Re[2]: Продолжительность существования Handle
От: v14d  
Дата: 18.10.07 08:49
Оценка:
Здравствуйте, Leonid Troyanovsky, Вы писали:

LT>Поставь на поток, владеющий этим окном хук WH_CALLWNDPROC*,

LT>тогда при разрушении окна можно реагировать на WM_DESTROY.

На самом деле мне это не понадобится, потому что это главное окно приложения.
Спасибо.
Re[2]: Продолжительность существования Handle
От: v14d  
Дата: 18.10.07 08:53
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Дескриптор окна не меняется в течение всего времени существования окна. Доказательство элементарно. Создаем окно


PD>hWnd = CreateWindow(...);


Именно учитывая этот факт, я и начал сомневаться.
Мне кажется я вспомнил что это я читал, там говорилось не следует сохранять Handle на продолжительное время например в файл на жестком диске (даже глупо, не правда ли?)
Спасибо.
Re[3]: Продолжительность существования Handle
От: Unmanaged Россия ICQ 476611995
Дата: 18.10.07 09:10
Оценка:
V>Мне кажется я вспомнил что это я читал, там говорилось не следует сохранять Handle на продолжительное время например в файл на жестком диске

Хендл писать в файл? Гы, какую траву ты курил?

V>(даже глупо, не правда ли?)


Не то слово.
STATUS_INVALID_DEVICE_REQUEST
Re[4]: Продолжительность существования Handle
От: Andrew S Россия http://alchemy-lab.com
Дата: 18.10.07 09:38
Оценка:
V>>Мне кажется я вспомнил что это я читал, там говорилось не следует сохранять Handle на продолжительное время например в файл на жестком диске

U>Хендл писать в файл? Гы, какую траву ты курил?


Не в первый раз наблюдаю от Вас такие высказывания. В общем, это... давайте выражать свои мысли более культурно и ясно. Если есть что сказать по делу — говорите внятно, а превращать форум в, извиняюсь, сортир (с) Путин — не надо. Спасибо.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[5]: Продолжительность существования Handle
От: Unmanaged Россия ICQ 476611995
Дата: 18.10.07 10:58
Оценка: -2
AS>В общем, это... давайте выражать свои мысли более культурно и ясно.

Давайте.
Вот пусть всякие v14d и начнут, так сказать, показывать пример.
А мне ваши замечания не интересны.
Найдите кого-нибудь ещё, к кому можно придраться.
Реагировать на подобные замечания более не стану, извините.
STATUS_INVALID_DEVICE_REQUEST
Re: Продолжительность существования Handle
От: Carc Россия http://www.amlpages.com/home.php
Дата: 18.10.07 12:30
Оценка:
> Конечно можно получать Handle каждый раз при помощи FindWindow, но дело в том что заголовок окна этого приложения все время меняется, хотя часть этого заголовка остается неизменным.
А можно то самое окно (если оно свое) о чем нибудь спросить!?!
Примерно так
1) const UINT message=RegisterWindowMessage("Ты ли это радость моя?");
2) const HWND hwndFind = FindWindow(...) — вроде что-то нашли, вроде как искомое окно!?!
3) SendMessageTimeout(hwndFind,....) — спросили найденное окно, если оно то, что нужно ответит например 1. Все остальные окна проигнорируют наше сообщение.

Хотя конечно
а) если искомое окно "свое" и мы можем добавить в нем обработку сообщения "Ты ли это радость моя?"
б) ну вообще окно может и не ответить в заданный срок, даже если и свое, если чем-то будет занято (например показывать MessageBox с текстом "Да я это! Я").

А если чужое то видимо лучше действительно использовать хук. Тогда можно быть уверенным что не пропустишь тот случай, когда окно закрыто, а система и таки вот успела создать другое окно с тем же HWND.
Posted via RSDN NNTP Server 2.1 beta
Aml Pages Home
Re: Продолжительность существования Handle
От: MShura  
Дата: 18.10.07 13:21
Оценка:
V>Я где-то читал что Handle окна возвращаемый некоторыми функциями нельзя использовать на продолжительное время.
V>Теперь я не могу найти где это я читалб по моему в MSDN.

Возможно вы читали
http://msdn2.microsoft.com/en-us/library/aa984758(vs.71).aspx

CWnd::OnParentNotify Changes
<skip>

afx_msg void OnParentNotify( UINT message, LPARAM lParam );

<skip>

If your Win32 code in OnParentNotify requires the child ID, retrieve it like this:
CWnd* pChild = FromHandle( (HWND)lParam );
int nID = pChild->GetDlgCtrlID();

In this example, FromHandle returns the CWnd object attached to the child window handle. The GetDlgCtrlID member function returns the child window ID. You could also retrieve the child ID by passing the child handle directly to the Windows GetDlgCtrlID function, but the code above also retrieves a pointer to the child CWnd object.

The pointer returned in pChild is temporary and should not be stored for use beyond the scope of OnParentNotify.

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.