Не могу понять почему при первом нажатии на кнопку(TEST_BTN) первые две процедуры проходят нормально, а последняя добовляет введенный текст. Ну а при последующих нажатиях на TEST_BTN переменные buf1, buf2, buf6 начинают к себе прибавлять текст из разных полей. Как это можно исправить. Код (Text): .586 .model flat, stdcall option casemap :none include \masm32\include\windows.inc include \masm32\macros\macros.asm uselib kernel32, user32, masm32, comctl32 include base64.asm WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD TEST_DIALOG = 1000 IDC_SHP1 = 100 TEST_BTN = 1001 EXIT_BTN = 1002 IDC_EDT1 = 1003 IDC_EDT2 = 1004 IDC_EDT3 = 1005 IDC_EDT4 = 1006 IDC_EDT5 = 1007 IDC_EDT6 = 1008 .data? hInstance dd ? hWnd dd ? icce INITCOMMONCONTROLSEX <> buf1 dd ? buf2 dd ? buf3 dd ? buf4 dd ? buf5 dd ? buf6 db ? buf7 dd ? lpBuf1 dd ? lpBuf2 dd ? lpBuf3 dd ? .code start: mov icce.dwSize, SIZEOF INITCOMMONCONTROLSEX mov icce.dwICC, ICC_DATE_CLASSES or \ ICC_INTERNET_CLASSES or \ ICC_PAGESCROLLER_CLASS or \ ICC_COOL_CLASSES invoke InitCommonControlsEx, offset icce invoke GetModuleHandle, NULL mov hInstance, eax invoke DialogBoxParam, hInstance, TEST_DIALOG, 0, offset WndProc, 0 invoke ExitProcess,eax WndProc proc hWin :DWORD, uMsg :DWORD, wParam :DWORD, lParam :DWORD switch uMsg case WM_INITDIALOG invoke SendMessage, hWin, WM_SETICON, 1, FUNC(LoadIcon, NULL, IDI_ASTERISK) ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% invoke SendDlgItemMessage, hWin, IDC_EDT1, EM_SETLIMITTEXT, -1, 0 invoke SendDlgItemMessage, hWin, IDC_EDT2, EM_SETLIMITTEXT, -1, 0 invoke SendDlgItemMessage, hWin, IDC_EDT3, EM_SETLIMITTEXT, -1, 0 invoke SendDlgItemMessage, hWin, IDC_EDT4, EM_SETLIMITTEXT, -1, 0 invoke SendDlgItemMessage, hWin, IDC_EDT5, EM_SETLIMITTEXT, -1, 0 invoke SendDlgItemMessage, hWin, IDC_EDT6, EM_SETLIMITTEXT, -1, 0 ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% case WM_COMMAND switch wParam case TEST_BTN ;%%%%%%%%%%%%%%%%%%%%%%%%%% invoke GetDlgItemText,hWin,IDC_EDT1,offset lpBuf1,50 .IF eax < 6 invoke MessageBox, hWin, chr$("Введите e-mail адрес"), chr$("Ошибка"), MB_ICONEXCLAMATION xor eax, eax ret .ELSE invoke lstrlen,offset lpBuf1 invoke _base64,offset lpBuf1,eax,offset buf1 invoke MessageBox,NULL,offset buf1,chr$("Проверка"),MB_OK .ENDIF invoke GetDlgItemText,hWin,IDC_EDT2,offset lpBuf2,50 .IF eax < 3 invoke MessageBox, hWin, chr$("Введите пароль"), chr$("Ошибка"), MB_ICONEXCLAMATION xor eax, eax ret .ELSE invoke lstrlen,offset lpBuf2 invoke _base64,offset lpBuf2,eax,offset buf2 invoke MessageBox,NULL,offset buf2,chr$("Проверка"),MB_OK .ENDIF invoke GetDlgItemText,hWin,IDC_EDT3,offset buf3,50 .IF eax < 6 invoke MessageBox, hWin, chr$("Введите адресс получателя"), chr$("Ошибка"), MB_ICONEXCLAMATION xor eax, eax ret .ENDIF invoke GetDlgItemText,hWin,IDC_EDT4,offset buf4,100 .IF eax < 6 invoke MessageBox, hWin, chr$("Вы не ввели от кого получить"), chr$("Ошибка"), MB_ICONEXCLAMATION xor eax, eax ret .ENDIF invoke GetDlgItemText,hWin,IDC_EDT5,offset buf5,100 .IF eax < 3 invoke MessageBox, hWin, chr$("Вы не ввели тему письма"), chr$("Ошибка"), MB_ICONEXCLAMATION xor eax, eax ret .ENDIF invoke GetDlgItemText,hWin,IDC_EDT6,offset lpBuf3,1024 .IF eax < 3 invoke MessageBox, hWin, chr$("Введите текст сообщения"), chr$("Ошибка"), MB_ICONEXCLAMATION xor eax, eax ret .ELSE invoke lstrlen,offset lpBuf3 invoke _base64,offset lpBuf3,eax,offset buf6 invoke MessageBox,NULL,offset buf6,chr$("Проверка"),MB_OK .ENDIF ;%%%%%%%%%%%%%%%%%%%%%%%%%% case EXIT_BTN jmp exit_program endsw case WM_CLOSE exit_program: invoke EndDialog, hWin, 0 endsw xor eax,eax ret WndProc ENDP end start
Вообще-то 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 ? и так далее