Як побороти помилку "1400: Неприпустимий дескриптор вікна"?
Створюю потік, в якому потрібно буде відловлювати деякі повідомлення. Тому в конструкторі створюю віконечко:
# XA0; m_hook_window: = TWinControl.Create (nil);
# XA0; m_hook_window.Visible: = false;
# XA0; m_hook_window.Left: = - 1;
# XA0; m_hook_window.Top: = - 1;
# XA0; m_hook_window.Width: = 1;
# XA0; m_hook_window.Height: = 1;
# XA0; m_hook_window.ParentWindow: = Application.Handle;
Ну і міняю його обробник на свій.
Все відмінно працює.
Зупиняю потік з програми і викликаю Destroy, # XA0; а на рядку
# XA0; m_hook_window.Free;
Видає помилку EOSerror: "System Error. Code 1400: Неприпустимий дескриптор вікна". Як побороти?
> Створюю потік, в якому потрібно буде відловлювати деякі
> Повідомлення. Тому в конструкторі створюю віконечко:
В общем-то, потік може обробляти (деякі) повідомлення
і без вікна.
> Ну і міняю його обробник на свій.
> Все відмінно працює.
> Зупиняю потік з програми і викликаю Destroy, # XA0; а на
> рядку
> # XA0; m_hook_window.Free;
Оне діяння досить сумнівно.
А додаток win32?
По-моєму AllocateHWND НЕ являтся потокобезпечна.
2 Leonid Troyanovsky: спасибі. Так запрацювало без винятків.
Ну щоб щось привласнити m_hook_window.ParentWindow. А що ще можна привласнити?
> # XA0; m_hook_window.Free;
> Оное діяння досить сумнівно.
P.S. Додаток Win32.
А чому мій первісний варіант був поганий? Адже до цього m_hook_window звертався тільки один потік?
Чому тут страждає "потокобезопсаность"? Через наявність Application.processmessages в потоці?
>> # XA0; m_hook_window.ParentWindow: = Application.Handle;
>> Навіщо?
> Ну щоб щось привласнити m_hook_window.ParentWindow. А
> Що ще можна привласнити?
Хендл вікна, створеного в тому ж потоці.
Хоча, мабуть, не дуже вдалий сам задум використання дочірнього вікна.
>> # XA0; m_hook_window.Free;
>> Оное діяння досить сумнівно.
Якщо з самого початку, то й саме створення вікна сумнівно,
бо якщо воно створюється в конструкторі, то це не вікно
створюваного потоку.
Ну, і з руйнуванням не все гладко, бо контроли включаються
в масив Controls and so on. Плюс послідовність -
при завершенні потоку вікна вже немає (вікно - власність потоку).
> 2 Набережних С. так можна мені використовувати AllocateHWND?
> Може якісь доп. заходи прийняти для збільшення
Пам'ять: 0.74 MB
Час: 0.085 c