В чем ошибка

Тема в разделе "WASM.WIN32", создана пользователем Rancorous, 8 янв 2011.

  1. Rancorous

    Rancorous New Member

    Публикаций:
    0
    Регистрация:
    8 янв 2011
    Сообщения:
    3
    Не могу понять почему при первом нажатии на кнопку(TEST_BTN) первые две процедуры проходят нормально, а последняя добовляет введенный текст. Ну а при последующих нажатиях на TEST_BTN переменные buf1, buf2, buf6 начинают к себе прибавлять текст из разных полей. Как это можно исправить.
    Код (Text):
    1. .586
    2. .model flat, stdcall
    3. option casemap :none
    4.  
    5. include \masm32\include\windows.inc
    6. include \masm32\macros\macros.asm
    7. uselib kernel32, user32, masm32, comctl32
    8. include base64.asm
    9.  
    10. WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
    11.  
    12. TEST_DIALOG = 1000
    13. IDC_SHP1 = 100
    14. TEST_BTN = 1001
    15. EXIT_BTN = 1002
    16. IDC_EDT1 = 1003
    17. IDC_EDT2 = 1004
    18. IDC_EDT3 = 1005
    19. IDC_EDT4 = 1006
    20. IDC_EDT5 = 1007
    21. IDC_EDT6 = 1008
    22. .data?
    23.   hInstance dd ?
    24.   hWnd dd ?
    25.   icce INITCOMMONCONTROLSEX <>
    26.   buf1 dd ?
    27.   buf2 dd ?
    28.   buf3 dd ?
    29.   buf4 dd ?
    30.   buf5 dd ?
    31.   buf6 db ?
    32.   buf7 dd ?
    33.   lpBuf1 dd ?
    34.   lpBuf2 dd ?
    35.   lpBuf3 dd ?
    36. .code
    37.   start:
    38.     mov icce.dwSize, SIZEOF INITCOMMONCONTROLSEX
    39.     mov icce.dwICC, ICC_DATE_CLASSES or \
    40.                     ICC_INTERNET_CLASSES or \
    41.                     ICC_PAGESCROLLER_CLASS or \
    42.                     ICC_COOL_CLASSES
    43.  
    44.     invoke InitCommonControlsEx, offset icce
    45.  
    46.     invoke GetModuleHandle, NULL
    47.     mov hInstance, eax
    48.  
    49.     invoke DialogBoxParam, hInstance, TEST_DIALOG, 0, offset WndProc, 0
    50.  
    51.     invoke ExitProcess,eax
    52.  
    53. WndProc proc hWin :DWORD, uMsg :DWORD, wParam :DWORD, lParam :DWORD
    54.   switch uMsg
    55.     case WM_INITDIALOG
    56.       invoke SendMessage, hWin, WM_SETICON, 1, FUNC(LoadIcon, NULL, IDI_ASTERISK)
    57.  ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    58.  
    59.       invoke SendDlgItemMessage, hWin, IDC_EDT1, EM_SETLIMITTEXT, -1, 0
    60.       invoke SendDlgItemMessage, hWin, IDC_EDT2, EM_SETLIMITTEXT, -1, 0
    61.       invoke SendDlgItemMessage, hWin, IDC_EDT3, EM_SETLIMITTEXT, -1, 0
    62.       invoke SendDlgItemMessage, hWin, IDC_EDT4, EM_SETLIMITTEXT, -1, 0
    63.       invoke SendDlgItemMessage, hWin, IDC_EDT5, EM_SETLIMITTEXT, -1, 0
    64.       invoke SendDlgItemMessage, hWin, IDC_EDT6, EM_SETLIMITTEXT, -1, 0
    65.  
    66.  ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    67.     case WM_COMMAND
    68.       switch wParam
    69.         case TEST_BTN
    70.        
    71. ;%%%%%%%%%%%%%%%%%%%%%%%%%%
    72.                        
    73.                             invoke GetDlgItemText,hWin,IDC_EDT1,offset lpBuf1,50
    74.                 .IF eax < 6
    75.                             invoke MessageBox, hWin, chr$("Введите e-mail адрес"), chr$("Ошибка"), MB_ICONEXCLAMATION
    76.                             xor eax, eax
    77.                                             ret
    78.                 .ELSE
    79.                                             invoke lstrlen,offset lpBuf1
    80.                                         invoke _base64,offset lpBuf1,eax,offset buf1
    81.                             invoke MessageBox,NULL,offset buf1,chr$("Проверка"),MB_OK
    82.                     .ENDIF
    83.                            invoke GetDlgItemText,hWin,IDC_EDT2,offset  lpBuf2,50
    84.                                 .IF eax < 3
    85.                             invoke MessageBox, hWin, chr$("Введите пароль"), chr$("Ошибка"), MB_ICONEXCLAMATION
    86.                             xor eax, eax
    87.                                             ret
    88.                 .ELSE
    89.                             invoke lstrlen,offset lpBuf2
    90.                                         invoke _base64,offset lpBuf2,eax,offset buf2
    91.                             invoke MessageBox,NULL,offset buf2,chr$("Проверка"),MB_OK
    92.                 .ENDIF
    93.                            invoke GetDlgItemText,hWin,IDC_EDT3,offset buf3,50
    94.  
    95.                                 .IF eax < 6
    96.                             invoke MessageBox, hWin, chr$("Введите адресс получателя"), chr$("Ошибка"), MB_ICONEXCLAMATION
    97.                             xor eax, eax
    98.                                             ret
    99.                 .ENDIF
    100.                            invoke GetDlgItemText,hWin,IDC_EDT4,offset buf4,100
    101.                                 .IF eax < 6
    102.                             invoke MessageBox, hWin, chr$("Вы не ввели от кого получить"), chr$("Ошибка"), MB_ICONEXCLAMATION
    103.                             xor eax, eax
    104.                                             ret
    105.                 .ENDIF
    106.                            invoke GetDlgItemText,hWin,IDC_EDT5,offset buf5,100
    107.                                 .IF eax < 3
    108.                             invoke MessageBox, hWin, chr$("Вы не ввели тему письма"), chr$("Ошибка"), MB_ICONEXCLAMATION
    109.                             xor eax, eax
    110.                                             ret
    111.                 .ENDIF
    112.                            invoke GetDlgItemText,hWin,IDC_EDT6,offset lpBuf3,1024
    113.                                 .IF eax < 3
    114.                             invoke MessageBox, hWin, chr$("Введите текст сообщения"), chr$("Ошибка"), MB_ICONEXCLAMATION
    115.                             xor eax, eax
    116.                                             ret
    117.                 .ELSE
    118.                             invoke lstrlen,offset lpBuf3
    119.                                         invoke _base64,offset lpBuf3,eax,offset buf6
    120.                             invoke MessageBox,NULL,offset buf6,chr$("Проверка"),MB_OK
    121.                 .ENDIF
    122. ;%%%%%%%%%%%%%%%%%%%%%%%%%%
    123.         case EXIT_BTN
    124.           jmp exit_program
    125.       endsw
    126.     case WM_CLOSE
    127.       exit_program:
    128.       invoke EndDialog, hWin, 0
    129.  
    130.     endsw
    131.  
    132.   xor eax,eax
    133. ret
    134. WndProc ENDP
    135.  
    136. end start
     
  2. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    Вообще-то GetDlgItemText возвращает строку. Некоторой длины, +0 в конце. Вы отвели на эти строки по 4 байта (dd ?), то есть фактически - 3 символа + завершающий 0. Теперь следите за руками ;)
    Первая строка записывается с адреса buf1 (до 50!!! знаков), занимая столько, сколько получилось (возможно, залезая при этом в buf2 и далее). Вторая строка нормально затирает хвост 1-й, 3-я - хвост 2-й, и так далее. После чего правильной строкой вас может порадовать только последний из обработанных элементов. А при попытке вывести 1-й вы получите 4 первых символа + 4 первых символа из 2-го контрола + 4 первых символа из 3-го и так далее, пока не попадется 0 (что может произойти и раньше чем дойдете до 7-го, если какая-то из предыдущих строк занимала менее 4 знаков). Естественно, чтобы поправить такое, буферы под текст надо объявлять как

    buf1 db 50 dup ?

    и так далее
     
  3. Rancorous

    Rancorous New Member

    Публикаций:
    0
    Регистрация:
    8 янв 2011
    Сообщения:
    3
    FatMoon спасибо помогло
    тему можно закрыть