Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Офф-топ

Страница: 1 |

 

  Вопрос: Си Добавлено: 09.10.05 09:40  

Автор вопроса:  Progos | Web-сайт: html-expert.org.ru | ICQ: 311715784 
Можно ли как-то взять адрес функции из класса.
Пример
class example
{
 example();
 long WProc(HWND P1,UINT P2,WPARAM P3,LPARAM P4);
 virtual ~example();
};

....

long ProcAdr;
ProcAdr=SetWindowLong(hWnd, GWL_WNDPROC,(LONG)WProc);

Выскакивает ошибка, типа нельзя перевести в лонг.
Для функций вне классов работает :(

Ответить

  Ответы Всего ответов: 8  

Номер ответа: 1
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #1 Добавлено: 09.10.05 15:05
Учить азы.

Функции классов имеют дополнительный параметр this, и потому их сигнатура не совпадает с таковой у модульных функций. Поэтому же их нельзя указывать в качестве callback для API.

Ответить

Номер ответа: 2
Автор ответа:
 Progos



ICQ: 311715784 

Вопросов: 39
Ответов: 157
 Web-сайт: html-expert.org.ru
 Профиль | | #2
Добавлено: 09.10.05 15:11
То есть их адрес вообще нельзя узнать?

Ответить

Номер ответа: 3
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #3 Добавлено: 09.10.05 16:41
Можно, но зачем он тебе?

class foo
{
public:
  int bar(){return 0;};
};

int main(int argc, char* argv[];)
{
  printf ("%u\n",&foo::bar);

  return 0;
}

Ответить

Номер ответа: 4
Автор ответа:
 Progos



ICQ: 311715784 

Вопросов: 39
Ответов: 157
 Web-сайт: html-expert.org.ru
 Профиль | | #4
Добавлено: 09.10.05 16:46
Спасибо

Ответить

Номер ответа: 5
Автор ответа:
 Progos



ICQ: 311715784 

Вопросов: 39
Ответов: 157
 Web-сайт: html-expert.org.ru
 Профиль | | #5
Добавлено: 09.10.05 17:44
Я разобрался!
Поэтому же их нельзя указывать в качестве callback для API

Оказывается - можно.
Вот код.

char* a;long origProc;
a=garbagestring(32);
sprintf (a,"%d",&Class::Proc);
origProc=StrToInt(a);
CallWindowProcA((WNDPROC)origProc, 0, 0,0,0);
MessageBox(0,a,0,0);

Ответить

Номер ответа: 6
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #6
Добавлено: 09.10.05 18:27
И изнутри класса тоже можно передавать его, только функция должна иметь атрибут static.

Ответить

Номер ответа: 7
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #7 Добавлено: 09.10.05 21:35
Угу...
Только раз уж она static, то проще сделать её в модуле и не страдать фигнёй с &class::func...

Ответить

Номер ответа: 8
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #8
Добавлено: 10.10.05 05:46
В случае инкапсуляции окна в класс вынесение оконной процедуры из класса является маст даем с точки зрения архитектуры, лучше применить грязный хак :)

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам