Можно ли в C написать DlgProc чтоб код был с одним ret(максимум двумя)..

Тема в разделе "WASM.WIN32", создана пользователем Asterix, 1 окт 2004.

  1. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    __declspec(naked) void start(void){
     
  2. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Quantum



    Спасибо, теперь работает :)



    Ты свой mail на hotmail проверяешь?
     
  3. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Asterix

    Периодически :)
     
  4. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    q_q

    Тут у тебя ошибка default должен быть сразу после break:
    Код (Text):
    1.       SendMessage(hwnd, WM_CLOSE, 0, 0);
    2.       break;
    3.     }
    4.   default:
    5.     r = FALSE;


    Так что return'ы нагляднее, меньше вероятность ошибиться :derisive:



    ЗЫ: И у меня тоже неправильно, блин, запутался я в этих break'ах %)
     
  5. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Quantum

    Ну и.. письмо получил?
     
  6. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Asterix

    Никак нет.



    ЗЫ: Написал.
     
  7. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Quantum

    Странно, напиши мне тогда письмо, может у меня адрес не тот..
     
  8. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Quantum

    Отправил снова, получил? :)

    Я как в мультике, удав привет передавал.. :)

    ты там в junk'е посмотри, мои письма hotmail любит туда совать :derisive:
     
  9. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Asterix

    Получил!!! И уже ответил.
     
  10. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Asterix

    Тут у тебя ошибка default должен быть сразу после break

    Заблуждаешься. default не является обязательной опцией оператора switch.



    По логике твоей DlgProc, TRUE возвращается только если обработаны WM_INITDIALOG, WM_CLOSE, WM_COMMAND + IDC_BUTTON_1, WM_COMMAND + IDC_BUTTON_2 или WM_COMMAND + IDC_BUTTON_3. Эту же логику я и реализовал, обойдясь при этом без наглядных return'ов. Imho использование большого количества return'ов в рамках отдельной подпрограммы плохо сказывается на сопровождении.
     
  11. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    q_q



    > Заблуждаешься. default не является обязательной опцией оператора switch.



    Я знаю.



    Ты считаешь правильно что после
    Код (Text):
    1. SendMessage(hwnd, WM_CLOSE, 0, 0);
    2.          break;


    попадаем на return FALSE, вместо TRUE?
    Код (Text):
    1. .text:004010BE 8B 45 10                                      mov     eax, [ebp+arg_8]
    2. .text:004010C1 25 FF FF 00 00                                and     eax, 0FFFFh
    3. .text:004010C6 89 45 F4                                      mov     [ebp+var_C], eax
    4. .text:004010C9 81 7D F4 CA 00 00 00                          cmp     [ebp+var_C], 0CAh
    5. .text:004010D0 74 02                                         jz      short loc_4010D4
    6. .text:004010D2 EB 10                                         jmp     short loc_4010E4
    7. .text:004010D4                               ; ---------------------------------------------------------------------- -----
    8. .text:004010D4                              
    9. .text:004010D4                               loc_4010D4:                             ; CODE XREF: DialogFunc+A1j
    10. .text:004010D4 6A 00                                         push    0               ; lParam
    11. .text:004010D6 6A 00                                         push    0               ; wParam
    12. .text:004010D8 6A 10                                         push    WM_CLOSE        ; Msg
    13. .text:004010DA 8B 4D 08                                      mov     ecx, [ebp+hWnd]
    14. .text:004010DD 51                                            push    ecx             ; hWnd
    15. .text:004010DE FF 15 18 20 40 00                             call    ds:SendMessageA
    16. .text:004010E4                              
    17. .text:004010E4                               loc_4010E4:                             ; CODE XREF: DialogFunc+2Bj
    18. .text:004010E4                                                                       ; DialogFunc+A3j
    19. .text:004010E4 C7 45 FC 00 00 00 00                          mov     [ebp+var_4], 0
    20. .text:004010EB                              
    21. .text:004010EB                               loc_4010EB:                             ; CODE XREF: DialogFunc+7Fj
    22. .text:004010EB                                                                       ; DialogFunc+8Dj
    23. .text:004010EB 8B 45 FC                                      mov     eax, [ebp+var_4]
    24. .text:004010EE 8B E5                                         mov     esp, ebp
    25. .text:004010F0 5D                                            pop     ebp
    26. .text:004010F1 C2 10 00                                      retn    10h
    27. .text:004010F1                               DialogFunc      endp
     
  12. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Quantum

    Получил!!! И уже ответил.



    Спасибо! Получил только что :), ещё не смотрел.
     
  13. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Asterix

    Теперь понял. Действительно ошибся. Надо добавлять default с FALSE и break перед вторым default'ом.
     
  14. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    q_q

    Т.е. вот так:
    Код (Text):
    1.       case IDB_EXIT:
    2.          SendMessage(hwnd, WM_CLOSE, 0, 0);
    3.          break;
    4.       default:
    5.          r = FALSE;
    6.      }
    7.       break;
    8.    default:
    9.       r = FALSE;
    10.   }
    11.   return r;
    12. }


    Не могу сказать что получилось очень понятно, да и код генерит странный..
    Код (Text):
    1. .text:004010EA 6A 00                                         push    0               ; lParam
    2. .text:004010EC 6A 00                                         push    0               ; wParam
    3. .text:004010EE 6A 10                                         push    WM_CLOSE        ; Msg
    4. .text:004010F0 8B 4D 08                                      mov     ecx, [ebp+hWnd]
    5. .text:004010F3 51                                            push    ecx             ; hWnd
    6. .text:004010F4 FF 15 18 20 40 00                             call    ds:SendMessageA
    7. .text:004010FA EB 07                                         jmp     short loc_401103
    8. .text:004010FC                               ; ---------------------------------------------------------------------- -----
    9. .text:004010FC                              
    10. .text:004010FC                               loc_4010FC:                             ; CODE XREF: DialogFunc+B5j
    11. .text:004010FC C7 45 FC 00 00 00 00                          mov     [ebp+r], 0
    12. .text:00401103                              
    13. .text:00401103                               loc_401103:                             ; CODE XREF: DialogFunc+B7j
    14. .text:00401103                                                                       ; DialogFunc+B9j ...
    15. .text:00401103 EB 07                                         jmp     short loc_40110C
    16. .text:00401105                               ; ---------------------------------------------------------------------- -----
    17. .text:00401105                              
    18. .text:00401105                               loc_401105:                             ; CODE XREF: DialogFunc+2Bj
    19. .text:00401105 C7 45 FC 00 00 00 00                          mov     [ebp+r], 0
    20. .text:0040110C                              
    21. .text:0040110C                               loc_40110C:                             ; CODE XREF: DialogFunc+7Fj
    22. .text:0040110C                                                                       ; DialogFunc+8Dj ...
    23. .text:0040110C 8B 45 FC                                      mov     eax, [ebp+r]
    24. .text:0040110F 8B E5                                         mov     esp, ebp
    25. .text:00401111 5D                                            pop     ebp
    26. .text:00401112 C2 10 00                                      retn    10h
    27. .text:00401112                               DialogFunc      endp
     
  15. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Asterix

    Т.е. вот так

    Да.



    Не могу сказать что получилось очень понятно, да и код генерит странный..

    Что конкретно не понятно и странно? Если не оптимально, то я предупреждал - если хочешь писать на Си, то прекращай мыслить как программист на ассемблере - утонешь в оптимизации.