информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Все любят медСетевые кракеры и правда о деле Левина
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 С наступающим 
 Microsoft обещает радикально усилить... 
 Ядро Linux избавляется от российских... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Лучше всего делать static-ом 18.09.04 15:03  Число просмотров: 1563
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> можно сделать static-членом, а при желании оформить
> функцию-член-класса совместимой по
> формату-вызова/параметрам и сделать наглон преобразование
> типа wndclassex.lpfn = (WNDPROC)((void*)MYCLASS::myfunc)
Потому как наглое явное преобразование чревато большими проблемами, если случайно захочется обратиться через этот самый this к членам-данным или попробовать вызывать функции-члены.
<programming>
[c++] можно ли сделать функцию обработки сообщений окна (wndproc) членом c++ класса? 13.09.04 07:31  
Автор: makeworld Статус: Member
<"чистая" ссылка>
Если сделать функцию обработки сообщений окна членом класса, то при создании класса окна (имеется ввиду WNDCLASSEX) выдается ошибка на строчке wndclassex.lpfnWndProc = WinProc

error C2440: '=' : cannot convert from 'LRESULT (__stdcall MYCLASS::* )(HWND,UINT,WPARAM,LPARAM)' to 'WNDPROC'

(окно создается с помощью функции CreateWindowsEx, соответственно для этого окна регистрируется класс функцией RegisterClassEx, где и происходит ошибка)

Видимо потому, что каждому элементу С++ класса неявно передается дополнительный параметр this и соответственно эта функция, являяся элементом класса, под тип WNDPROC не подходит.

Так вот, можно ли как-нибудь функцию обработки сообщений окна сделать членом класса?
членом класса нет, а вот friend'ом - можно 13.09.04 09:51  
Автор: Killer{R} <Dmitry> Статус: Elderman
<"чистая" ссылка>
А установив SetWindowLong(hwnd,GWL_USERDATA,(DWORD)this) при создании окна в конкретном экземляре и делая GetWindowLong(hwnd,GWL_USERDATA) в оконной процедуре можно работать со "своим" объектом в процедуре.
можно сделать static-членом... 13.09.04 13:37  
Автор: leo <Леонид Юрьев> Статус: Elderman
<"чистая" ссылка>
можно сделать static-членом, а при желании оформить функцию-член-класса совместимой по формату-вызова/параметрам и сделать наглон преобразование типа wndclassex.lpfn = (WNDPROC)((void*)MYCLASS::myfunc)
Лучше всего делать static-ом 18.09.04 15:03  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> можно сделать static-членом, а при желании оформить
> функцию-член-класса совместимой по
> формату-вызова/параметрам и сделать наглон преобразование
> типа wndclassex.lpfn = (WNDPROC)((void*)MYCLASS::myfunc)
Потому как наглое явное преобразование чревато большими проблемами, если случайно захочется обратиться через этот самый this к членам-данным или попробовать вызывать функции-члены.
static метод класса может обращаться только к static... 20.09.04 07:24  
Автор: makeworld Статус: Member
Отредактировано 20.09.04 07:25  Количество правок: 1
<"чистая" ссылка>
> > можно сделать static-членом, а при желании оформить
> > функцию-член-класса совместимой по
> > формату-вызова/параметрам и сделать наглон
> преобразование
> > типа wndclassex.lpfn =
> (WNDPROC)((void*)MYCLASS::myfunc)
> Потому как наглое явное преобразование чревато большими
> проблемами, если случайно захочется обратиться через этот
> самый this к членам-данным или попробовать вызывать
> функции-члены.
static метод класса может обращаться только к static переменным, а мне нужно из этой функции иметь доступ к некоторым переменным внутри класса. или есть способ из static метода обратиться к обычным переменным?
К сказанному Ktirf-ом добавлю 22.09.04 10:15  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> static метод класса может обращаться только к static
> переменным, а мне нужно из этой функции иметь доступ к
> некоторым переменным внутри класса. или есть способ из
> static метода обратиться к обычным переменным?
Что если ты объявишь обычную функцию-член (как __thiscall), а потом внаглую приведешь ее тип к __stdcall, то обращаться к переменным-членам все равно не сможешь. Все обращения к переменным идут неявно через this (то бишь m_Var = 10; эквивалентно this->m_Var = 10;), а если в этом this (который в том же VC передается через ecx) будет мусор, то и обращения будут в никуда. Лучше уж сразу от них отказаться.
Re: К сказанному Ktirf-ом добавлю 22.09.04 15:09  
Автор: leo <Леонид Юрьев> Статус: Elderman
<"чистая" ссылка>
> Что если ты объявишь обычную функцию-член (как __thiscall),
> а потом внаглую приведешь ее тип к __stdcall, то обращаться
> к переменным-членам все равно не сможешь. Все обращения к
> переменным идут неявно через this (то бишь m_Var = 10;
> эквивалентно this->m_Var = 10;), а если в этом this
> (который в том же VC передается через ecx) будет мусор, то
> и обращения будут в никуда. Лучше уж сразу от них
> отказаться.

Конечно, если так прыгать на грабли :-)
Но можно просто объявить функцию-член как __stdcall, и всё будет хорошо если конечно this одинарный(sizeof(this) == sizeof(void*)). Сложный this может быть при множественном и/или виртуальном наследовании, но такую ситуацию можно поймать используя #pragma pointers_to_members(...).
Обычно это делается прокидыванием указателя на объект через параметры статического метода. 20.09.04 11:52  
Автор: Ktirf <Æ Rusakov> Статус: Elderman
<"чистая" ссылка>
Также хочу напомнить, что имея HWND, можно получить указатель на CWnd, а из него воспользовавшись динамическим приведением типа - указатель на объект нужного класса.
В VC++.NET явное преобразавание вообще не проходит, при... 19.09.04 07:28  
Автор: makeworld Статус: Member
Отредактировано 19.09.04 07:33  Количество правок: 1
<"чистая" ссылка>
> > можно сделать static-членом, а при желании оформить
> > функцию-член-класса совместимой по
> > формату-вызова/параметрам и сделать наглон
> преобразование
> > типа wndclassex.lpfn =
> (WNDPROC)((void*)MYCLASS::myfunc)
> Потому как наглое явное преобразование чревато большими
> проблемами, если случайно захочется обратиться через этот
> самый this к членам-данным или попробовать вызывать
> функции-члены.

В VC++.NET явное преобразование вообще не проходит, при сборке выдается ошибка
Если нельзя, но очень хочется, 22.09.04 10:24  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
То можно

> В VC++.NET явное преобразование вообще не проходит, при
> сборке выдается ошибка
Дело в том, что большинство C-style преобразований понимаются компилятором как static_cast (кроме выкидывания спецификатора const, который const_cast). Если уж очень хочется выстрелить себе в ногу, можешь попробовать reinterpret_cast, или прокинуть указатель через (void *).
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2025 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach