адрес member функции на этапе выполнения

Тема в разделе "LANGS.C", создана пользователем KingT, 30 ноя 2009.

  1. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    ну.. и что? какие здесь смещения и что с чем здесь складывается?
     
  2. KingT

    KingT Member

    Публикаций:
    0
    Регистрация:
    12 янв 2006
    Сообщения:
    208
    Посмотрел дебуггером адрес pMethod = &MyClass::Method; в самом классе и в теле функции после создания обьекта.Адреса совпадают.Тоесть pMethod указыват на адрес метода и этот адрес абсолютный.Можно его нелегально или легально привести к типу WNDPROC?
     
  3. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    KingT
    первый параметр у не статичных членов, это неявный указатель this
     
  4. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    KingT
    Никак не поймёшь, что у объекта есть данные. Вот как раз указатель на эти данные и нужен функциям объекта. Забудь про абсолютные и не абсолютные указатели.
     
  5. KingT

    KingT Member

    Публикаций:
    0
    Регистрация:
    12 янв 2006
    Сообщения:
    208
    не сочтите за извращение промежуточный вариант такой
    Код (Text):
    1. LRESULT (window::*pMethod)(HWND,UINT,WPARAM,LPARAM);
    2. pMethod = &window::wndproc;
    3. int a = 0;
    4. _asm
    5. {
    6.     mov eax,pMethod
    7.     mov a,eax
    8. }
    9. wndclass.lpfnWndProc=(WNDPROC)a;
    Работает.Тоесть указатель pMethod можно использовать даже только нет возможности его легально привести к типу WNDPROC.
     
  6. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    KingT
    Ты гений, все остальные лохи.
     
  7. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    KingT
    1) int != DWORD (unsigned long)
    2) обманули проверку типов и ваш код теперь непереносим.
    3) Чем вам статик не угодил?

    Объявляете вашу функцию window::wndproc как статик:

    static LRESULT wndproc (HWND,UINT,WPARAM,LPARAM);

    в коде пишете:

    Код (Text):
    1. wndclass.lpfnWndProc=(WNDPROC)&window::wndproc;
    В итоге все очень красиво. Зачем так заморачиваться.
     
  8. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    KingT

    Саттер плачет кровавыми слезами :)))
     
  9. KingT

    KingT Member

    Публикаций:
    0
    Регистрация:
    12 янв 2006
    Сообщения:
    208
    Да причем тут гений не гений.Я же просто учусь.Это экспериментальный код.Я прекрасно понимаю что так делать нельзя.