Зачем в программе процедура окна, если она ни разу не вызывается?

Тема в разделе "WASM.BEGINNERS", создана пользователем amvoz, 16 дек 2008.

  1. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    640
    Здравствуйте, друзья! Вот, учусь сейчас по этому материалу.
    http://www.wasm.ru/article.php?article=1001003
    Тут дан пример, как нарисовать окно. И создана оконная процедура WndProc. И её роль хорошо объяснена:

    "Пpоцедуpа окна получает сообщение и pеагиpует на это соответствующе."

    Допустим (!) мне это понятно. Но эта процедура нигде в программе не вызываетcя! В программе нет строки
    invoke WndProc или call WndProc!
    Есть просто OFFSET WndProc
    Но это не вызов ведь, это просто берётся адрес первой инструкции этой процедуры и прописывается в соответсвующее поле структуры. Наконец, есть WndProc proc и WndProc endp. Это, понятно, тоже не вызовы.

    ...Ясное дело, как-то эта процедура вызывается. Но как? Из какого места в программе? Не пойму. Спасибо, если кто снизойдёт до объяснений.
    ...Мне там много чего непонятно. Из перечня вопросов решил пока выбрать этот, он вроде ключевой непонятный. Может дальше лучше пойдёт дело. Хотя не уверен.
    ...Если кто ответит- с первого раза не пойму, однозначно. Буду вопросы задавать, сразу говорю.
     
  2. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    вызывать процедуру будет виндовс каждый раз, когда окну прийдет сообщение. Твоя программа и не должна ее вызывать
     
  3. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    640
    Я Вас правильно понял, что когда я заполняю структуру... Когда пишу класс окна и пишу такие строчки:

    LOCAL wc:WNDCLASSEX ;это объявление локальной переменной wc типа WNDCLASSEX
    ...
    mov wc.lpfnWndProc, OFFSET WndProc ;а это заполнение поля структуры

    я тем самым, грубо говоря, посылаю OFFSET WndProc куда надо, чтобы потом Windows там этот адрес посмотрела и по нему в нужный момент обратилась? По крайней мере, больше OFFSET WndProc нигде не светитcя у меня!
     
  4. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    может всеже учиться winapi на ЯВУ? и вообще, по литературе именно про winapi, где все что надо написано
     
  5. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Именно так.
     
  6. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    640
    Спасибо большое.
     
  7. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    amvoz
    только
    это не когда заполняешь поле структуры, а когда передаёшь заполненную структуру системе:
    invoke RegisterClass, addr wc
     
  8. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    amvoz
    Из нескольких ;) Во-первых, из цикла обработки сообщений - DispatchMessage вызывает SendMessage для соотв.окна, которая и шлет сообщение в WndProc. Во-вторых, и винда, и приложение могут слать сообщения окнам напрямую через SendMessage (минуя очередь). В-третьих, при сабклассинге можно\нужно вызывать процедуру родительского окна через CallWindowProc
     
  9. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    640
    ...И сразу же- а где у этой функции (WndProc) прототип? Это функция наша ведь, авторская, значит, прототип должен быть, а его нет.

    Я только угадывать могу. Коль скоро эта функция обязана быть (а она обязана быть, исходя из того, что мы регистрируем класс окна и прописываем там OFFSET WndProc. Значит, её не может не быть, этой функции.) Можно предположить, что перед вызовом этой функции Windows сама внесёт в стек значения аргументов. (Так и есть, перед вызвом этой функции в стек 4 раза что-то кладётся, очень похоже на значения аргументов, посмотрел в OllyDbg) То есть нам нет смысла об этом заботиться (ведь пиша прототип, мы резервируем место в стеке для аргументов функции, так ведь?). В этом смысле WndProc сродни функциям API. И в этом её отличие от авторской.

    ...И, соответственно, перед внесением в стек, Windows придаст аргументам этой функции hWnd, uMsg, wParam, lParam необходимые зачения. А то я смотрел файлах-инклудах, они нигде не определены, и явно тоже (в программе) не определены!
    Правильно я мыслю?
    ...А то знаете, надеяться, что где-то это объяснено и это где-то легко найти... Мне эти-то труды были рекомендованы как самое-то...
     
  10. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Выше написан бред.

    Прототип функции окна определен как

    Код (Text):
    1. LRESULT CALLBACK WindowProc(      
    2.     HWND hwnd,
    3.     UINT uMsg,
    4.     WPARAM wParam,
    5.     LPARAM lParam
    6. );
    http://msdn.microsoft.com/en-us/library/ms633573(VS.85).aspx
     
  11. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    640
    Угу. Нет, так-то всё нормально, только я вёл речь за одну функцию (WndProc), а вы мне говорите за другую (WindowProc). И потом: что с того, что некая функция определена где-то, если её прототипа нет в подключаемых файлах или в тексте программы?
    А этого прототипа там нет. Ни у одной функции, ни у другой.
     
  12. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Это одно и тоже. Название значения не имеет. Важно количество и тип параметров.
     
  13. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    640
    Как это одно и то же? Не морочьте мне голову. Если вы знаете место, где написано
    WndProc equ WindowProc,
    то так и скажите. У меня вот не получилось в подключаемых файлах нигде его найти.
     
  14. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    amvoz
    У окнной функции прототип всегда один и тот же и название (ее и параметров) значение не имеет.
     
  15. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    640
    Да? Это тонкость... Ну, что ж, когда-нибудь в дебрях интернета, я наткнусь на подтверждение этой мысли. Может быть. Спасибо. И это... А прописан-то он где? Прототип оконной функции! Его нет в подключаемых файлах! (Я почти догадался, что он необязателен, но хотелось бы увидеть подтверждение)
     
  16. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    amvoz
    msdn читай
     
  17. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    В подключаемых файлах прототип оконной функции определен в файле winuser.h под именем DefWindowProc.

    Mы уже выучили, что имя значения не имеет. Да ?
     
  18. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Строго говоря, для создания оконной функции нам не нужен прототип. Ведь прототип нужен только для вызова функции, а мы ее не вызываем. Мы просто должны создать функцию согласно документации. По ссылке выше функция полность документирована.
     
  19. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    640
    include \masm32\include\windows.inc
    include \masm32\include\user32.inc
    includelib \masm32\lib\user32.lib ;
    include \masm32\include\kernel32.inc
    includelib \masm32\lib\kernel32.lib

    Вот какие файлы у меня подключены. winuser.h среди них нет.
    Имя имеет значение. Всегда.
    Не имеет значения если под разными именами скрывается одно и то же. Но вообще, я не понимаю, к чему это Вы клоните. Пока же хотелось бы обратить Ваше внимание на отстутствие файла winuser.h
     
  20. TermoSINteZ

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

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.549
    Адрес:
    Russia
    Ну народ, ппц. Неужели трудно без C стиля обойтись. В асме обычно (если внимательно почитаешь туториалы ICZELION`a)
    прототип выглядит так:
    Код (Text):
    1. WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
    Как видишь, название другое, ведь важны именно число параметров. И еще - почитай еще раз и еще, до просветления.