Окна ОС Windows и потоки

Тема в разделе "WASM.WIN32", создана пользователем Bill_Prisoner, 8 сен 2005.

  1. Bill_Prisoner

    Bill_Prisoner New Member

    Публикаций:
    0
    Регистрация:
    4 май 2005
    Сообщения:
    238
    В книге Джеффри Рихтера "Windows для профессионалов" написано, что поток владеет созданным им окном. Если поток вызывает функцию CreateWindow, то с потоком ассоциируется структура THREADINFO. В этой структуре содержатся поля очереди синхронных и асинхронных сообщений и некоторые другие. А как насчет того, если этот же поток создаст второе, третье....окно? Что для каждого из окон создается еще одна структура THREADINFO?

    И второй вопрос: программа может иметь два окна консольное и созданное с помощью функции CreateWindow. События приходящие к нормальному окну обрабатывает поток, который создал это окно. А какой поток обрабатывает события которые приходят к консольному окну?
     
  2. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229


    Тот же самый
     
  3. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    Bill_Prisoner

    1. Структура одна на поток по идее. И создается она вроде при создании не окна, а очереди сообщений.



    2. Насколько мне удалось понять, "Консольные окна" имеют лишь посредственное отношения к нормальным окнам. Механизм сообщений в их отношении может и отсутствовать, поскольку он исповедуется user32.dll, а все функции работы с консолью относятся к kernel32.dll. Если бы консольные окна работали через сообщения в контексте процесса(и потока) который их создает, то при трассировке (или приостановке потока) блокировалась бы их отрисовка и ввод. Мне намекнули что возможно консольные окна рисуются в режиме ядра.

    Еще что интересно - консольные окна позволяют отображать диалоговое окно настроек, сообщения которого обрабатываются в контексте процесса. Стало быть user32.dll при этом подгружается динамически.

    [edited]

    Сначала загружается console.dll, из которой вызывается функция CPlApplet, которая уже и отображает диалог настроек. Либа user32.dll указана в разделе импорта console.dll
     
  4. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    AFAIK, окна не имеют собственных очередей сообщений.

    Все оконные сообщения(синхр. и асинхр.), посланные окнам потока из другого потока, складируются в очереди потока и раздаются окнам при вызове Get(Peek)Message.



    Консольные окна создаются и отрисовываются в user mode (в процессе csrss.exe)
     
  5. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    green

    Стало быть и Window(Class) Extra Memory тоже находятся в ведении csrss.exe? А то я тут в соседнем топике пытался выяснить, почему с консольным окном по описателю GetWindowLong работает, а SetWindowLong нет (ошибка ERROR_ACCESS_DENIED).
     
  6. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    alpet

    Да.

    Кстати по-моему ф-ции Get(Set)WindowLongработают только с окнами тек. процесса.
     
  7. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    green

    Это верно - они работают с АП текущего процесса. Другое дело каким образом тогда симулируется выполнение GetWindowLong (она возвращает нормальные значения). Кстати GetWindowLong (hConWnd, GWL_WNDPROC) возвращает 0FFFF05D3h - адрес странный даже для ring0.