Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.03.2011, 14:23   #1
Ibanez Wizard
Адский тунеядец
Форумчанин
 
Аватар для Ibanez Wizard
 
Регистрация: 11.06.2010
Сообщений: 164
По умолчанию Копирование строки из Edit в другой Edit.

Попытался написать программу, которая будет копировать строку из одного дочернего окна, в другое с помощью команды movsb. Программа не выполняет, то что должна. В чем моя ошибка?

Код:
.386
.model flat, stdcall
option casemap : none
include\masm32\include\windows.inc
include\masm32\include\kernel32.inc
include\masm32\include\user32.inc
includelib\masm32\lib\kernel32.lib
includelib\masm32\lib\user32.lib

WinMain proto : DWORD, :DWORD, :DWORD, :DWORD

ButtonID equ 1
EditID_1 equ 2
EditID_2 equ 3

.data?
hInstance dd ?
CommandLine dd ?
hwndButton dd ?
hwndEdit_1 dd ?
hwndEdit_2 dd ?
string db 10 dup(?)
string_1 db 10 dup(?)


.data
AppName db "Window", 0
ClassName db "Window", 0
EditClassName db "Edit", 0
ButtonClassName db "Button", 0
ButtonText db "Скопировать", 0

.code
start:
invoke GetModuleHandle, NULL
mov hInstance, eax
invoke GetCommandLine
mov CommandLine, eax
invoke WinMain, hInstance, NULL, CommandLine, SW_SHOWDEFAULT
invoke ExitProcess, eax

WinMain proc hInst : HINSTANCE, hPrevInst:HINSTANCE, CmdLine:LPSTR, CmdShow:DWORD
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
LOCAL hwnd:HWND

mov wc.cbClsExtra, 0
mov wc.cbWndExtra, 0
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.hbrBackground, COLOR_WINDOW+1
mov wc.cbSize, sizeof WNDCLASSEX
push hInstance
pop wc.hInstance
invoke LoadIcon, NULL, IDI_APPLICATION
mov wc.hIcon, eax
mov wc.hIconSm, eax
invoke LoadCursor, NULL, IDC_ARROW
mov wc.hCursor, eax
mov wc.lpfnWndProc, offset WndProc
mov wc.lpszMenuName, NULL
mov wc.lpszClassName, offset ClassName

invoke RegisterClassEx, addr wc
invoke CreateWindowEx, NULL, addr ClassName, addr AppName, \
                     WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, \
					 CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL
mov hwnd, eax
invoke UpdateWindow, hwnd
invoke ShowWindow, hwnd, SW_SHOWNORMAL

.while TRUE
invoke GetMessage, addr msg, NULL, NULL, NULL
.break .if(!eax)
invoke TranslateMessage, addr msg
invoke DispatchMessage, addr msg
.endw
mov eax, msg.wParam
ret

WinMain endp

WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
.if uMsg==WM_CREATE
invoke CreateWindowEx, WS_EX_CLIENTEDGE, addr ButtonClassName, addr ButtonText, \
                     WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON, 20, 150, \
		180, 25, hWnd, ButtonID, hInstance, NULL
mov hwndButton, eax
invoke CreateWindowEx, WS_EX_CLIENTEDGE, addr EditClassName, NULL, \
                     WS_CHILD or WS_VISIBLE or WS_BORDER or ES_LEFT or\
                           ES_AUTOHSCROLL, 20, 100, \
		180, 25, hWnd, EditID_1, hInstance, NULL
mov hwndEdit_1, eax
invoke SetFocus, hwndEdit_1
invoke CreateWindowEx, WS_EX_CLIENTEDGE, addr EditClassName, NULL, \
                     WS_CHILD or WS_VISIBLE or WS_BORDER or ES_LEFT or\
                           ES_AUTOHSCROLL, 20, 50, \
		180, 25, hWnd, EditID_2, hInstance, NULL
mov hwndEdit_2, eax
invoke SetFocus, hwndEdit_2

.elseif uMsg==WM_COMMAND
mov eax, wParam
.if ax == ButtonID
invoke GetWindowText, hwndEdit_1, addr string, NULL
call copy_string
invoke SetWindowText, hwndEdit_2, addr string_1
.endif

.elseif uMsg==WM_DESTROY
invoke PostQuitMessage, 0
.else
invoke DefWindowProc, hWnd, uMsg, wParam, lParam
ret
.endif
xor eax, eax
ret
WndProc endp 


;функция копирующая строку
copy_string proc
cld
lea esi, string
lea edi, string_1
mov ecx, 10
rep movsb
ret
copy_string endp


end start
Ibanez Wizard вне форума Ответить с цитированием
Старый 27.03.2011, 17:22   #2
yuran666666
Форумчанин
 
Аватар для yuran666666
 
Регистрация: 23.04.2009
Сообщений: 346
По умолчанию

Третий аргумент функции GetWindowText вроде как количество считываемых из контрола символов, здесь он NULL - выводы? Также функция копирования строки не нужна.
SetFocus устанавливает фокус на окна/дочерние окна(контролы) по их хендлу
Нет, ну правда..
yuran666666 вне форума Ответить с цитированием
Старый 27.03.2011, 21:11   #3
Ibanez Wizard
Адский тунеядец
Форумчанин
 
Аватар для Ibanez Wizard
 
Регистрация: 11.06.2010
Сообщений: 164
По умолчанию

А весь смысл программы не выполнение задачи, а тренировка: вспоминание работы с дочерними окнами и учеба работы со строками на ассемблере.
Ibanez Wizard вне форума Ответить с цитированием
Старый 29.03.2011, 02:46   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

вам же написали же.
GetWindowText принимает третим параметром длину буфера в символах.
передав NULL вы таким образом копировать то не куда.
да и копировать то не куда.
ибо апи само скопирует куда надо.
Код:
.386
.model flat, stdcall
option casemap : none
include\masm32\include\windows.inc
include\masm32\include\kernel32.inc
include\masm32\include\user32.inc
includelib\masm32\lib\kernel32.lib
includelib\masm32\lib\user32.lib

WinMain proto : DWORD, :DWORD, :DWORD, :DWORD

ButtonID equ 1
EditID_1 equ 2
EditID_2 equ 3

.data?
hInstance dd ?
CommandLine dd ?
hwndButton dd ?
hwndEdit_1 dd ?
hwndEdit_2 dd ?
string db 10 dup(?)


.data
AppName db "Window", 0
ClassName db "Window", 0
EditClassName db "Edit", 0
ButtonClassName db "Button", 0
ButtonText db "Скопировать", 0

.code
start:
invoke GetModuleHandle, NULL
mov hInstance, eax
invoke GetCommandLine
mov CommandLine, eax
invoke WinMain, hInstance, NULL, CommandLine, SW_SHOWDEFAULT
invoke ExitProcess, eax

WinMain proc hInst : HINSTANCE, hPrevInst:HINSTANCE, CmdLine:LPSTR, CmdShow:DWORD
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
LOCAL hwnd:HWND

mov wc.cbClsExtra, 0
mov wc.cbWndExtra, 0
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.hbrBackground, COLOR_WINDOW+1
mov wc.cbSize, sizeof WNDCLASSEX
push hInstance
pop wc.hInstance
invoke LoadIcon, NULL, IDI_APPLICATION
mov wc.hIcon, eax
mov wc.hIconSm, eax
invoke LoadCursor, NULL, IDC_ARROW
mov wc.hCursor, eax
mov wc.lpfnWndProc, offset WndProc
mov wc.lpszMenuName, NULL
mov wc.lpszClassName, offset ClassName

invoke RegisterClassEx, addr wc
invoke CreateWindowEx, NULL, addr ClassName, addr AppName, \
                     WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, \
					 CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL
mov hwnd, eax
invoke UpdateWindow, hwnd
invoke ShowWindow, hwnd, SW_SHOWNORMAL

.while TRUE
invoke GetMessage, addr msg, NULL, NULL, NULL
.break .if(!eax)
invoke TranslateMessage, addr msg
invoke DispatchMessage, addr msg
.endw
mov eax, msg.wParam
ret

WinMain endp

WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
.if uMsg==WM_CREATE
invoke CreateWindowEx, WS_EX_CLIENTEDGE, addr ButtonClassName, addr ButtonText, \
                     WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON, 20, 150, \
		180, 25, hWnd, ButtonID, hInstance, NULL
mov hwndButton, eax
invoke CreateWindowEx, WS_EX_CLIENTEDGE, addr EditClassName, NULL, \
                     WS_CHILD or WS_VISIBLE or WS_BORDER or ES_LEFT or\
                           ES_AUTOHSCROLL, 20, 100, \
		180, 25, hWnd, EditID_1, hInstance, NULL
mov hwndEdit_1, eax
invoke SetFocus, hwndEdit_1
invoke CreateWindowEx, WS_EX_CLIENTEDGE, addr EditClassName, NULL, \
                     WS_CHILD or WS_VISIBLE or WS_BORDER or ES_LEFT or\
                           ES_AUTOHSCROLL, 20, 50, \
		180, 25, hWnd, EditID_2, hInstance, NULL
mov hwndEdit_2, eax
invoke SetFocus, hwndEdit_2

.elseif uMsg==WM_COMMAND
mov eax, wParam
.if ax == ButtonID
invoke GetWindowText, hwndEdit_1, addr string, 10
invoke SetWindowText, hwndEdit_2, addr string
.endif

.elseif uMsg==WM_DESTROY
invoke PostQuitMessage, 0
.else
invoke DefWindowProc, hWnd, uMsg, wParam, lParam
ret
.endif
xor eax, eax
ret
WndProc endp


end start
вроде так надо.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Копирование из edit Babyshka Помощь студентам 6 13.03.2010 12:58
копирование из ячейки таблицы в edit xaero93 БД в Delphi 2 23.10.2009 11:46
поиск/копирование данных в edit kate158 Компоненты Delphi 4 24.09.2009 16:58
копирование текста из Edit в RichEdit Rebel123 Общие вопросы Delphi 16 21.09.2009 15:49
Как скопировать текст в буфер обмена с одного edit-a и вставить в другой SeRhy Общие вопросы Delphi 2 26.07.2008 23:02