Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Почему функция обработки окна должна быть, статичной? 
V
    Опции темы
Royan
Дата 12.5.2006, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: нет
Всего: 15



Я написал обертку для класса окна. В нем у меня как полагается есть функция обработки сообщений (WindowProc) окна. Вопрос может ли она быть не статичной? Если не может то почему? Мне хотелось бы понять причины почему именно так происходит. Вот пример того о чем идет речь: http://www.codeproject.com/win32/win32windowwrapperclass.asp

Добавлено @ 14:07 
Кажется я просто не проснулся. В приведенной мною же статье есть ответ на этот вопрос. 


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
GremlinProg
Дата 13.5.2006, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата

The main problem
When you create a WNDCLASSEX structure you need to give the structure a pointer to your window procedure in the lpfnWndProc member. The window procedure is a callback, a special kind of function called directly by Windows when needed.

To make callbacks work correctly, strict typedefs are defined in the Windows header files. If you try to use a class member as a callback, the compiler will give you an error, saying that the member prototype does not match the required typedef.

To get around this compiler error, we need to make the window procedure static. From this static method we then call another method of the class to actually handle the messages.

Да, здесь есть часть ответа, но в конечном счете, компилятор можно всегда обмануть и указать любую другую функцию в качестве процедуры окна.

Главная же причина в том, что очень умные люди просто придумали некий стандарт, который позволяет нам встраивать в Win32 свои оконные классы и, соответственно, окна. Стандарт этот говорит нам о том, что процедура окна имеет 16 байт параметров, которые опускаются в стек, а возвращает 4-х байтовый результат, с поднятием стека на те же 16 байт. Есть несколько стандартов вызова процедур и функций: fastcall, cdecl, stdcall, thiscall, pascal(Borland придумал) и т.д. Win32 использует stdcall, поэтому мы все тоже его используем. Напишет Microsoft винду с другим интерфейсом - и нам всем придется использовать именно его. thiscall весьма похож на cdecl, но не на stdcall, поэтому нужно использовать то, что нам диктует Microsoft. 


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
DeadSoul
Дата 13.5.2006, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

Репутация: нет
Всего: 11



Цитата(GremlinProg @  13.5.2006,  12:42 Найти цитируемый пост)
компилятор можно всегда обмануть и указать любую другую функцию в качестве процедуры окна.

Я бы не рекомендовал это делать 


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
GremlinProg
Дата 13.5.2006, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



ну, это я утрирую, обмануть - в этом случае значит средствами преобразования адреса, привести его к требуемому виду.
Код

union{
  A a;
  B b;
}myC = {myA};
return myC.b

это тоже преобразование, хотя и не явное. Все по закону, ни какого обмана. 
Аналогично нреобразуются 64-битные адреса в 32-битные. Не может же микрософт сама над собой глумиться. 

Это сообщение отредактировал(а) GremlinProg - 13.5.2006, 13:14


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
DeadSoul
Дата 13.5.2006, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

Репутация: нет
Всего: 11



GremlinProg, в случае с преобразованиями указателей на функции последствия могут быть очень "веселыми". Программа будет падать, а почему это происходит придется искать очень долго 


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
GremlinProg
Дата 13.5.2006, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата

Программа будет падать, а почему это происходит придется искать очень долго

почему это происходит я описал в первом посте. Естественно, такие преобразования опасны, поэтому прибегать к ним нужно только со знанием дела, а не пытаться набить заплатку. Я просто показал, что это делать не запрещено и ни чего более. 


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.2268 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.