Консультация № 145373
29.09.2008, 01:55
0.00 руб.
29.09.2008, 02:03
0 2 1
Уважаемые эксперты, очень прошу вас написать решение такой задачи(при решении использовать WIN API 32 для MASM32). На форме должны быть Текстовая область и кнопки Save и Load. При помощи кнопки Save, введеный в текстовое поле текст, должен сохраняться в файл. При нажатии кнопки Load, текст должен выгружаться из файла в текстовую область. Также буду крайне признателен, если в добавку к коду вы подскажете мне парочку хороших книг по программированию на Ассемблере для ОС Windows.

Обсуждение

Неизвестный
02.10.2008, 14:50
общий
это ответ
Здравствуйте, Егоров Ярослав Владимирович!

Программа для MASM 32.
Сохранение текста осуществляется в файл "edit_text_file" в 2-байтовой юникод кодировке.

Ч. Петзольд "Программирование для Windows 95"
П.В. Румянцев "Азбука программирования в Win32 API"
Юрий Щупак "Win 32 API"

Приложение:
.386
.model flat,stdcall

include \masm32\include\windows.inc

include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\gdi32.inc

includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\gdi32.lib


.data
main_window_class WNDCLASSEX <TYPE WNDCLASSEX,CS_HREDRAW or CS_VREDRAW,OFFSET MainWindowProc,0,0,,,,,,OFFSET main_window_class_name,>
main_window_class_name DB 'Приложение Win32',0
main_window_name DB 'main window',0

button_class_name DB 'button',0
button1_window_name DB 'save_button_win',0
button1_text DB 'Save',0
button2_window_name DB 'load_button_win',0
button2_text DB 'Load',0

edit_class_name DB 'edit',0
edit1_window_name DB 'text_edit_win',0
edit1_text DB 0

file_name DB 'edit_text_file',0


.data?
handle_instance DD ? ;дескриптор экземпляра приложения
handle_main_window DD ?
handle_button1 DD ?
handle_button2 DD ?
handle_edit1 DD ?
program_message MSG <?>


button1_ID = 0B1h
button2_ID = 0B2h
edit1_ID = 0E1h

edit1_text_max_length = 30h

.code
start:

invoke GetModuleHandleA, 0
mov handle_instance,eax
mov main_window_class.WNDCLASSEX.hInstance,eax

invoke LoadCursorA, 0,IDC_ARROW
mov main_window_class.WNDCLASSEX.hCursor,eax

invoke GetStockObject, LTGRAY_BRUSH
mov main_window_class.WNDCLASSEX.hbrBackground,eax

invoke RegisterClassExA, OFFSET main_window_class
test ax,ax
jz exit

invoke CreateWindowExA, 0,OFFSET main_window_class_name,OFFSET main_window_name,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,300,200,0,0,handle_instance,0
mov handle_main_window,eax

;создать кнопку "save"
invoke CreateWindowExA, 0,OFFSET button_class_name,OFFSET button1_window_name,WS_CHILD or WS_VISIBLE or BS_PUSHBUTTON,10,50,65,30,handle_main_window,button1_ID,handle_instance,0
mov handle_button1,eax
invoke SendMessageA, handle_button1,WM_SETTEXT,0,addr button1_text

;создать кнопку "load"
invoke CreateWindowExA, 0,OFFSET button_class_name,OFFSET button2_window_name,WS_CHILD or WS_VISIBLE or BS_PUSHBUTTON,100,50,65,30,handle_main_window,button2_ID,handle_instance,0
mov handle_button2,eax
invoke SendMessageA, handle_button2,WM_SETTEXT,0,addr button2_text

;создать текстовое поле
invoke CreateWindowExA, 0,OFFSET edit_class_name,OFFSET edit1_window_name,WS_CHILD or WS_VISIBLE or WS_BORDER or ES_LEFT,10,14,275,21,handle_main_window,edit1_ID,handle_instance,0
mov handle_edit1,eax
invoke SendMessageA, handle_edit1,WM_SETTEXT,0,addr edit1_text

;отобразить главное окно
invoke ShowWindow, handle_main_window,SW_SHOWNORMAL


program_message_loop:
invoke GetMessageA, ADDR program_message,0,0,0
test ax,ax
jz exit

invoke TranslateMessage, ADDR program_message
invoke DispatchMessageA, ADDR program_message
jmp program_message_loop

exit:
invoke ExitProcess, 0


;-------------------MainWindowProc-----------------------
MainWindowProc PROC hwnd:DWORD, mes:DWORD, wparam:DWORD, lparam:DWORD
LOCAL file_handle:DWORD, bytes_written:DWORD, bytes_read:DWORD, edit_text_buf[(edit1_text_max_length+1)*2]:BYTE

cmp mes,WM_DESTROY
je wmdestroy
cmp mes,WM_COMMAND
je wmcommand
jmp default

wmcommand:
cmp WORD PTR wparam,button1_ID
je button1_was_pressed
cmp WORD PTR wparam,button2_ID
je button2_was_pressed
jmp default

;button1 - save
button1_was_pressed:
invoke SendMessageW, handle_edit1,WM_GETTEXT,(edit1_text_max_length+1)*2,addr edit_text_buf
invoke CreateFileA, addr file_name,GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0
mov file_handle,eax
invoke WriteFile, file_handle,addr edit_text_buf,(edit1_text_max_length+1)*2,addr bytes_written,0
invoke CloseHandle, file_handle

xor eax,eax
ret


;button2 - load
button2_was_pressed:
invoke CreateFileA, addr file_name,GENERIC_READ,0,0,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,0
mov file_handle,eax
invoke ReadFile, file_handle,addr edit_text_buf,(edit1_text_max_length+1)*2,addr bytes_read,0
invoke CloseHandle, file_handle
invoke SendMessageW, handle_edit1,WM_SETTEXT,0,addr edit_text_buf

xor eax,eax
ret

wmdestroy:
invoke PostQuitMessage, 0

xor eax,eax
ret

default:
invoke DefWindowProcA, hwnd,mes,wparam,lparam
ret
MainWindowProc ENDP

END start
Неизвестный
02.10.2008, 15:24
общий
При компилировании кода данного в ответе, компилятор выдает целый перечень ошибок такого типа:
d:\masm32\include\windows.inc(129) : error A2004: symbol type conflict : bool
d:\masm32\include\windows.inc(7804) : error A2179: structure improperly initialized
d:\masm32\include\windows.inc(7804) : error A2008: syntax error : in structure
Как их можно устранить? А также, по какой причине возникают эти ошибки?
Форма ответа