WMmail.ru - сервис почтовых рассылок

вторник, 31 января 2017 г.

RFpro.ru: Ассемблер? Это просто! Учимся программировать

 
Если выпуск не отображается, вы можете прочесть его на сайте
  

  
Полка из закаленного стекла для Vista 9951 black Полка из закаленного стекла для Vista 9951 black
Купить за 13717 руб. Подробнее...

  TT 15S1 white TT 15S1 white
Купить за 141000 руб. Подробнее...

  V90-DAC V90-DAC
Купить за 15101 руб. Подробнее...

 
  
     
   RFpro.ru: Ассемблер? Это просто! Учимся программировать
  

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты в разделе

Evgen aka Chuma
Статус: 4-й класс
Рейтинг: 141
• повысить рейтинг »
Коцюрбенко Алексей aka Жерар
Статус: Мастер-Эксперт
Рейтинг: 92
• повысить рейтинг »
nikitos82.01
Статус: 1-й класс
Рейтинг: 0
• повысить рейтинг »

• Assembler

Номер выпуска:1641
Дата выхода:31.01.2017, 20:45
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:36 / 14
Вопросов / ответов:3 / 7

Консультация # 16777: Здравствуйте,как сделать так чтобы когда я запускол EXE файл в дебагере и жал RUN она выполнялась не сразу вся, а по строчкам,то есть по этапно.И еще как узнать какая строчка кода отвечкет за введения кода авторизации.просто в DEMO он не просит авторизации а в FULL просит.Спасибо Посмотрите код EXE файла проги.Вышлю на e-mail.Если хотите....
Консультация # 178366: Здравствуйте! Нужна помощь в написании программы/ Задание: Организовать набор текста в окне и затем его сохранения в файл по выходу из программы. Команды выполняются по нажатию кнопок с пиктограммами на окне типа Toll Bar. 32 битная система..на XP. на MASM. заранее благодарен.....
Консультация # 123274: пожалуйсто помогите!ВОПРОС!!_работа с строчним оператором.сложить цифры в строку @str db "25".взять во внимание что код цифры 0 и символа "0" отличаются на 48...

Консультация # 16777:

Здравствуйте,как сделать так чтобы когда я запускол EXE файл в дебагере и жал RUN она выполнялась не сразу вся, а по строчкам,то есть по этапно.И еще как узнать какая строчка кода отвечкет за введения кода авторизации.просто в DEMO он не просит авторизации а в FULL просит.Спасибо
Посмотрите код EXE файла проги.Вышлю на e-mail.Если хотите.

Дата отправки: 08.02.2005, 21:37
Вопрос задал: Лебедев Станислав Николаевич
Всего ответов: 4
Страница онлайн-консультации »


Консультирует AxMAD:

Здравствуйте, Лебедев Станислав Николаевич!
Всё зависит от дебагера!
Но приблизительно ставишь отметку, что надо остановиться на данном этапе(часто это клавиша F8)...
А вот насчёт взлома программы не всё может быть так просто, читайте соотвю документацию(лучше Криса Касперски)

Консультировал: AxMAD
Дата отправки: 09.02.2005, 09:14
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует DSota:

Здравствуйте, Лебедев Станислав Николаевич!
Это зависит от отладчика. Обычно на это используется F8 или F7. Всегда можно посмотреть в справке на слово "next Step" или что-то похожее.
Если SoftIce - то там по умолчанию тоже F8, но может быть перенастроено, набирай команду "t".
А отлаживать ты можешь только там, где разрешено (до команды ARPL, или до места вызова присвоения атрибутов сокрытия сегменту кода)... Так-что отладить вряд ли получится так просто.

Консультировал: DSota
Дата отправки: 09.02.2005, 09:18
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Стас:

Здравствуйте, Лебедев Станислав Николаевич!
Способов искать регистрацию множество, и зависит от проги.
Например если при неправильном коде авторизации выводится окошко (MessageBox) ставят BPX MessageBoxA и BPX MessageBoxW. Или можно попытаться отловить ввод в окно диалога: BPX GetDlgItem. (Эти примеры для Win32 проги и SoftIce).

Консультировал: Стас
Дата отправки: 10.02.2005, 01:35
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Tigran K. Kalaidjian:

Здравствуйте, Лебедев Станислав Николаевич!
1. укажите, каким дебагером Вы пользуетесь, а то так сразу нельзя сказать. В общем случае ищите пункт меню типа trace, debug, step over и т.д. Обычно им соответствуют кнопки F7, F8.
2. Чтобы найти нужное место в программе, нужно догадаться, какая функция отвечает за принятие данных от формы и поставить в отладчике на эту функцию брекпоинт. Для Win32 это обычно GetDlgItemText

Консультировал: Tigran K. Kalaidjian
Дата отправки: 11.02.2005, 15:35
Рейтинг ответа:

НЕ одобряю 0 одобряю!

Консультация # 178366:

Здравствуйте! Нужна помощь в написании программы/ Задание: Организовать набор текста в окне и затем его сохранения в файл по выходу из программы. Команды выполняются по нажатию кнопок с пиктограммами на окне типа Toll Bar. 32 битная система..на XP. на MASM. заранее благодарен..

Дата отправки: 13.05.2010, 15:37
Вопрос задал: Angel1731
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Лысков Игорь Витальевич (Старший модератор):

Здравствуйте, Angel1731.
Вот Вам редактор:

  	.386  	.model	flat, stdcall	; 32 bit memory model  	option	casemap :none	; case sensitive    ;include files  include	\MASM32\INCLUDE\windows.inc  include	\MASM32\INCLUDE\masm32.inc  include	\MASM32\INCLUDE\gdi32.inc  include	\MASM32\INCLUDE\user32.inc  include	\MASM32\INCLUDE\kernel32.inc  include	\MASM32\INCLUDE\Comctl32.inc  include \MASM32\INCLUDE\comdlg32.inc  include	\MASM32\INCLUDE\shell32.inc  include	\MASM32\INCLUDE\oleaut32.inc    ;libraries  includelib \MASM32\LIB\masm32.lib  includelib \MASM32\LIB\gdi32.lib  includelib \MASM32\LIB\user32.lib  includelib \MASM32\LIB\kernel32.lib  includelib \MASM32\LIB\Comctl32.lib  includelib \MASM32\LIB\comdlg32.lib  includelib \MASM32\LIB\shell32.lib  includelib \MASM32\LIB\oleaut32.lib    ;=================  ; Прототипы функций  ;=================  WinMain		PROTO :DWORD,:DWORD,:DWORD,:DWORD  WndProc		PROTO :DWORD,:DWORD,:DWORD,:DWORD  TopXY		PROTO :DWORD,:DWORD  Paint_Proc	PROTO :DWORD,:DWORD  EditML		PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD  Read_File_In	PROTO :DWORD,:DWORD  Confirmation	PROTO :DWORD  Write_2_Disk	PROTO :DWORD  SaveFileAs	PROTO  SaveFile	PROTO  WordWrap	PROTO  EditProc	PROTO :DWORD,:DWORD,:DWORD,:DWORD  About	 	PROTO  GetFileName	PROTO :DWORD, :DWORD, :DWORD  SaveFileName	PROTO :DWORD, :DWORD, :DWORD  Do_ToolBar	PROTO :DWORD  SetBmpColor	PROTO :DWORD  Do_Status	PROTO :DWORD    ;=============  ; Макро  ;=============  ;макро для формирования строки в коде  szText	MACRO	Name, Text:VARARG  LOCAL	lbl  	jmp	lbl  Name	db	Text,0  lbl:  	ENDM    ;макро для копирования из переменной в переменную через стек  m2m	MACRO	M1, M2  	push	M2  	pop	M1  	ENDM    ;макро для выхода из функции с результатом в EAX  return	MACRO	arg  	mov	eax, arg  	ret  	ENDM    ;макро для toolbar-а  ;дополнительные данные для структуры TBBUTTON  TBextraData	MACRO  	mov	tbb.fsState, TBSTATE_ENABLED  	mov	tbb.dwData, 0  	mov	tbb.iString, 0  	ENDM    ;макро для добавления кнопки  TBbutton	MACRO	bID, cID  	mov	tbb.iBitmap, bID	;; button ID number  	mov	tbb.idCommand, cID	;; command ID number  	mov	tbb.fsStyle, TBSTYLE_BUTTON  	invoke	SendMessage, hToolBar, TB_ADDBUTTONS, 1, ADDR tbb  	ENDM    ;макро для добавления разделителя  TBblank	MACRO  	mov	tbb.iBitmap, 0  	mov	tbb.idCommand, 0  	mov	tbb.fsStyle, TBSTYLE_SEP  	invoke	SendMessage, hToolBar, TB_ADDBUTTONS, 1, ADDR tbb  	ENDM    ;создание toolbar-а  Create_Tool_Bar	MACRO	Wd, Ht    	szText	tbClass, "ToolbarWindow32"	;;имя класса toolbar-а    	invoke	CreateWindowEx, 0,  				ADDR tbClass,  				ADDR szDisplayName,  				WS_CHILD or WS_VISIBLE,  				0, 0, 500, 40,  				hWin, NULL,  				hInstance, NULL  	mov	hToolBar, eax			;;сохраним handle  	  	;;задаем размер струкруры TBBUTTON  	invoke	SendMessage, hToolBar, TB_BUTTONSTRUCTSIZE, sizeof TBBUTTON,0  	  	;;указываем размер bitmap-а, для этого сформируем DWORD с размером  	mov	ecx, Wd			;; loword = bitmap Width  	mov	eax, Ht			;; hiword = bitmap Height  	shl	eax, 16  	mov	ax, cx  	mov	bSize, eax  	invoke	SendMessage, hToolBar, TB_SETBITMAPSIZE, 0, bSize  	  	;;подправим цвет bitmap-а  	invoke	SetBmpColor, hTbBmp  	mov	hTbBmp, eax		;;handle Bmp    	;;добавляем bitmap в toolbar  	mov	tbab.hInst, 0  	m2m	tbab.nID, hTbBmp  	invoke	SendMessage, hToolBar, TB_ADDBITMAP, 10, ADDR tbab  	  	;размер кнопки такой же, как и bitmap-а  	invoke	SendMessage, hToolBar, TB_SETBUTTONSIZE, 0, bSize  	ENDM    	.data  CommandLine	dd	0		;адрес командной строки  hWnd		dd	0		;handle основного окна  hInstance	dd	0		;экземпляр  hIcon	 	dd	0		;handle пиктограммки  hEdit	 	dd	0		;handle окна редактора  WrapFlag	dd	0		;флаг переноса строк  lpEditProc	dd	0		;адрес предыдущей функции окна редактора  hStatus		dd	0		;handle статуса  hTbBmp		dd	0		;handle BitMap-а  hToolBar	dd	0		;handle ToolBar-а  szDisplayName 	db	"QEdit",0	;заголовок программы  szUntitled	db	"Untitled",0	;имя файла по-умолчанию  szOpenedAt	db	"Прочитано ",0	;сообщение о длине прочитанного файла  szSavedAt	db	"Записано ",0	;сообщение о длине записанного файла  bytes	 	db	" байт",0	;конец сообщений о длине файла    WrapON		db	" Wrap ON",0	;режим Wrap (перенос строк) включен  WrapOFF		db	" Wrap OFF",0	; выключен    szTitleO	db	"Открыть файл",0;заголовок окна выбора файла для чтения  szTitleS	db	"Сохранить файл как",0	;для сохранения  szFilter	db	"Все файлы",0,"*.*",0,	;маска файлов для выбора  			"Текстовые файлы (*.TXT)",0,"*.TXT",0,0    ofn		OPENFILENAME <>		;структура для открытия файла  szFileName	db	260 dup(0)	;буфер для имени файла    	.code  start:					;точка входа  	invoke	GetModuleHandle, NULL  	mov	hInstance, eax		;handle экземпляра    	invoke	GetCommandLine  	mov	CommandLine, eax	;строка параметров    	invoke	InitCommonControls	;подгружаем библиотеку comctl32.dll    ;стандартный вызов GUI-программ  	invoke	WinMain, hInstance, NULL, CommandLine, SW_SHOWDEFAULT  	invoke	ExitProcess,eax		;завершение    WinMain	proc	hInst		:DWORD,  		hPrevInst	:DWORD,  		CmdLine		:DWORD,  		CmdShow		:DWORD    LOCAL	wc		:WNDCLASSEX	;класс окна  LOCAL	msg		:MSG		;сообщения  LOCAL	Wwd		:DWORD		;ширина окна  LOCAL	Wht		:DWORD		;высота окна  LOCAL	Wtx		:DWORD		;позиция x вывода на экране  LOCAL	Wty		:DWORD		;позиция y вывода на экране  LOCAL	clBuffer[128]	:BYTE		;буфер для параметра      	szText	szClassName, "QEdit_Class"	;имя класса нашего окна    ;заполняем стуктуру wc  	mov	wc.cbSize, sizeof WNDCLASSEX	;размер  	mov	wc.style, CS_HREDRAW or CS_VREDRAW or CS_BYTEALIGNWINDOW ;стиль  	mov	wc.lpfnWndProc,	offset WndProc	;функция окна  	mov	wc.cbClsExtra, NULL		;дополнительные данные класса окна  	mov	wc.cbWndExtra, NULL		;дополнительные данные для экземпляра окна  	m2m	wc.hInstance, hInst		;экземпляр программы  	invoke	GetStockObject, HOLLOW_BRUSH	;пустая кисть для фона   	mov	wc.hbrBackground, eax		; (все равно перекрывается редактором)  	mov	wc.lpszMenuName, 600		;меню из ресурсов  	mov	wc.lpszClassName, offset szClassName ;имя класса  	invoke	LoadIcon, hInst, 500		;icon ID  	mov	hIcon, eax			;сохраним в hIcon  	mov	wc.hIcon, eax			;32*32  	mov	wc.hIconSm, eax			;16*16  	invoke	LoadCursor, NULL, IDC_ARROW  	mov	wc.hCursor, eax			;курсор    	invoke	RegisterClassEx, ADDR wc	;регистрируем класс    	mov	Wwd, 600			;ширина окна  	mov	Wht, 400			;высота окна    	invoke	GetSystemMetrics, SM_CXSCREEN	;ширина экрана  	invoke	TopXY, Wwd, eax  	mov	Wtx, eax			;позиция x    	invoke	GetSystemMetrics, SM_CYSCREEN	;высота экрана  	invoke	TopXY, Wht, eax  	mov	Wty, eax			;позиция y    	invoke	CreateWindowEx, 0,		;создаем окно  				ADDR szClassName,  				ADDR szUntitled,  				WS_OVERLAPPEDWINDOW,  				Wtx, Wty, Wwd, Wht,  				NULL, NULL,  				hInst, NULL  	mov	hWnd, eax			;сохраним handle окна    	invoke	GetCL, 1, ADDR clBuffer		;читаем первый параметр из командной стоки    	.if eax == 1				;что-то есть?  ;считаем именем файла и загружаем в редактор  		invoke	Read_File_In, ADDR clBuffer, hEdit  		.if eax != -1			;если нет ошибки  						; то выводим имя файла в заголовок  			invoke	SetWindowText, hWnd, ADDR clBuffer  		.endif  	.endif    	invoke	ShowWindow, hWnd, SW_SHOWNORMAL	;показываем  	invoke	UpdateWindow, hWnd		;обновляем    StartLoop:					;цикл обработки сообщений  	invoke	GetMessage,ADDR msg,NULL,0,0  	test	eax, eax  	jz	ExitLoop  	invoke	TranslateMessage, ADDR msg  	invoke	DispatchMessage, ADDR msg  	jmp	StartLoop    ExitLoop:  	return	msg.wParam			;выход  WinMain endp    WndProc	proc	hWin	:DWORD,			;функция окна  		uMsg	:DWORD,  		wParam	:DWORD,  		lParam	:DWORD    LOCAL	tbh		:DWORD  LOCAL	sbh		:DWORD  LOCAL	wWid		:DWORD  LOCAL	wHgt		:DWORD  LOCAL	Rct		:RECT  LOCAL	tbab		:TBADDBITMAP  LOCAL	tbb		:TBBUTTON    	.if uMsg == WM_COMMAND    ;команды меню и toolbar-а    ;- новый файл ---------------------------  	.elseif wParam == 1000  ;было ли изменено содержимое редактора  		invoke	SendMessage, hEdit, EM_GETMODIFY, 0, 0  		.if eax == TRUE		;Было?  ;спросим, что делать  			invoke	Confirmation, hWin  			.if eax == IDYES  ;да - сохраняем и создаем новый файл  				invoke	SaveFile  			.elseif eax == IDCANCEL  ;нет - ничего не делаем  				xor	eax, eax  				ret  			.endif  		.endif    ;обнуляем содержимое редактора  		invoke	SetWindowText, hEdit, NULL  ;имя файла по-умолчанию в заголовок  		invoke	SetWindowText, hWin, ADDR szUntitled  ;очищаем поле 2 в статусе  		invoke	SendMessage, hStatus, SB_SETTEXT, 2, NULL    ;- открыть файл -------------------------  	.elseif wParam == 1001  ;было ли изменено содержимое редактора  		invoke	SendMessage, hEdit, EM_GETMODIFY, 0, 0  		.if eax == TRUE		;Было?  ;спросим, что делать  			invoke	Confirmation, hWin  			.if eax == IDYES  ;да - сохраняем и открываем файл  				invoke	SaveFile  			.elseif eax == IDCANCEL  ;нет - ничего не делаем  				xor	eax, eax  				ret  			.endif  		.endif    ;сбросим имя файла  		mov	szFileName, 0  ;вызываем стандартную функцию для ввола имени файла  		invoke	GetFileName, hWin, ADDR szTitleO, ADDR szFilter  ;что-то ввели?  		.if szFileName[0] != 0  ;файл загружаем в редактор  			invoke	Read_File_In, ADDR szFileName, hEdit  ;все ок?  			.if eax != -1  ;выводим имя файда в заголовок окна  				invoke	SetWindowText, hWin, ADDR szFileName  			.endif  		.endif    ;- сохранить файл с тем же именем ---------  	.elseif wParam == 1002  		invoke	SaveFile	;сохраняем файл    ;- сохранить файл с запросом имени (только из меню)  	.elseif wParam == 1003  		invoke	SaveFileAs	;сохраняем файл с запросом имени  	.endif    ;- выход ---------------------------------  	.if wParam == 1010  		invoke	SendMessage, hWin, WM_SYSCOMMAND, SC_CLOSE, NULL    ;- показать диалог about -----------------  	.elseif wParam == 1900  		invoke About  	.endif    ;- Undo ----------------------------------  	.if wParam == 1100  		invoke SendMessage,hEdit,WM_UNDO,0,0    ;- Cut -----------------------------------  	.elseif wParam == 1101  		invoke SendMessage,hEdit,WM_CUT,0,0    ;- Copy ----------------------------------  	.elseif wParam == 1102  		invoke SendMessage,hEdit,WM_COPY,0,0    ;- Paste ---------------------------------  	.elseif wParam == 1103  		invoke SendMessage,hEdit,WM_PASTE,0,0    ;- Delete --------------------------------  	.elseif wParam == 1104  		invoke SendMessage,hEdit,WM_CLEAR,0,0    ;- WordWrap ------------------------------  	.elseif wParam == 1105	;Wordwrap  		invoke WordWrap    	.endif    ;====== конец команд меню uMsg=WM_COMMAND ======    ;- передача фокуса в редактор --------------------------  	.elseif uMsg == WM_SETFOCUS  		invoke SetFocus, hEdit    ;- при смене системных цветов пересоздать toolbar ------  	.elseif uMsg == WM_SYSCOLORCHANGE  		invoke	Do_ToolBar, hWin    ;- создание окна ---------------------------------------  	.elseif uMsg == WM_CREATE  		invoke	Do_ToolBar, hWin	;toolbar  		invoke	Do_Status,hWin		;статус    		mov	WrapFlag, 0		;изначально флаг переноса строк выключен  ;создаем редактор  		invoke	EditML, NULL, 0, 30, 300, 200, hWin, 700, WrapFlag  		mov hEdit, eax			;handle редактора    ;сабклассинг функции окна редактора  		invoke	SetWindowLong, hEdit, GWL_WNDPROC, EditProc  		mov	lpEditProc, eax    ;сообщение WrapOFF в статус  		invoke	SendMessage, hStatus, SB_SETTEXT, 1, ADDR WrapOFF    ;- изменение размеров окна -----------------------------  	.elseif uMsg == WM_SIZE  ;команда toolbar-у подправить свой размер  		invoke	SendMessage, hToolBar, TB_AUTOSIZE, 0, 0  ;та же команда статусу  		invoke	MoveWindow, hStatus, 0, 0, 0, 0, TRUE    ;получим размеры органов управления  		invoke	GetClientRect, hToolBar, ADDR Rct  		m2m	tbh, Rct.bottom		;высота toolbar-а    		invoke	GetClientRect, hStatus, ADDR Rct  		m2m	sbh, Rct.bottom		;высота statusbar-а     		invoke	GetClientRect, hWin, ADDR Rct  		m2m	wWid, Rct.right		;ширина окна  		m2m	wHgt, Rct.bottom	;высота окна    		mov	eax, tbh		;отнимем от высоты окна  		sub	wHgt, eax		;высоту toolbar-а  		mov	eax, sbh		;и высоту statusbar-а   		sub	wHgt, eax    ;перемещаем редактор  		invoke	MoveWindow, hEdit, 0, tbh, wWid, wHgt, TRUE    ;- закрытие --------------------------------------------  	.elseif uMsg == WM_CLOSE  ;было ли изменено содержимое редактора  		invoke	SendMessage, hEdit, EM_GETMODIFY, 0, 0  		.if eax == TRUE		;Было?  ;спросим, что делать  			invoke	Confirmation, hWin  			.if eax == IDYES  ;да - сохраняем и открываем файл  				invoke	SaveFile  			.elseif eax == IDCANCEL  ;нет - ничего не делаем  				xor	eax, eax  				ret  			.endif  		.endif    ;- уничтожение -----------------------------------------  	.elseif uMsg == WM_DESTROY  		invoke	PostQuitMessage,NULL  		return	0   	.endif    ;- отработка по-умолчанию ------------------------------  	invoke DefWindowProc,hWin,uMsg,wParam,lParam    	ret    WndProc endp    ;размещаем окно посередине экрана  ;wDim - размерность (ширина, высота) окна  ;sDim - размерность (ширина, высота) экрана  ;получаем в eax начало окна в выбранной размерности  TopXY	proc wDim:DWORD, sDim:DWORD    	shr	sDim, 1		; экранная размерность пополам  	shr	wDim, 1		; оконная размерность пополам  	mov	eax, wDim	;   	sub	sDim, eax	; sDim/2 - wDim/2    	return	sDim		; eax = sDim/2 - wDim/2    TopXY	endp    ;создаем редактор  EditML	proc	szMsg:DWORD, tx:DWORD, ty:DWORD, wd:DWORD, ht:DWORD,  		hParent:DWORD, ID:DWORD, Wrap:DWORD    LOCAL	hCtl	:DWORD  LOCAL	eStyle	:DWORD    ;имя класа  	szText	CtlStyle, "EDIT"    ;стиль  	mov	eStyle, WS_VISIBLE or WS_CHILDWINDOW or \  			WS_VSCROLL or ES_NOHIDESEL or \  			ES_AUTOVSCROLL or ES_MULTILINE    	.if Wrap == 0		;если нет переноса строк  		or	eStyle, WS_HSCROLL or ES_AUTOHSCROLL  	.endif    ;создаем редактор  	invoke	CreateWindowEx, WS_EX_CLIENTEDGE, ADDR CtlStyle, szMsg,  				eStyle, tx, ty, wd, ht, hParent, ID, hInstance, NULL  	mov	hCtl, eax    ;будем использовать шрифт FIXED FONT  	invoke	GetStockObject, SYSTEM_FIXED_FONT  	invoke	SendMessage, hCtl, WM_SETFONT, eax, TRUE    	return	hCtl		;вернем handle редактора    EditML endp    ;читаем файл lpszDiskFile в редактор hEditControl  Read_File_In	proc	lpszDiskFile:DWORD, hEditControl:DWORD    LOCAL	hFile		:DWORD  LOCAL	hMem$		:DWORD  LOCAL	ln		:DWORD  LOCAL	br		:DWORD  LOCAL	txtBuffer[256]	:BYTE  LOCAL	sizeBuffer[16]	:BYTE    ;открываем фацл на чтение  	invoke	CreateFile, lpszDiskFile, GENERIC_READ, FILE_SHARE_READ,  			NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL  	mov	hFile, eax    	.if eax == -1		;открылся?  ;нет - выводим сообщение  		szText	szMessFile, "Файл '"  		szText	szMessNotFound, "' не найден"  		invoke	lstrcpy, ADDR txtBuffer, ADDR szMessFile  		invoke	lstrcat, ADDR txtBuffer, lpszDiskFile  		invoke	lstrcat, ADDR txtBuffer, ADDR szMessNotFound  		invoke	MessageBox, hWnd, ADDR txtBuffer, ADDR szDisplayName, MB_OK  		mov	eax, -1  		ret  	.endif  ;получим длину файла  	invoke	GetFileSize, hFile, NULL  	mov	ln, eax    	.if ln > 32767		;простой edit может принять только 32к символов  ;выводим сообщение о слишком длинном файле  		invoke	CloseHandle, hFile  		szText	tooBig, "' больше 32767 байт"  		invoke	lstrcpy, ADDR txtBuffer, ADDR szMessFile  		invoke	lstrcat, ADDR txtBuffer, lpszDiskFile  		invoke	lstrcat, ADDR txtBuffer, ADDR tooBig  		invoke	MessageBox, hWnd, ADDR txtBuffer, ADDR szDisplayName, MB_OK  		mov	eax, -1  		ret  	.endif    ;выделим память для буфера  	invoke	SysAllocStringByteLen, 0, ln  	mov	hMem$, eax		;сохраним адрес буфера    ;читаем файл  	invoke	ReadFile, hFile, hMem$, ln, ADDR br, NULL  ;и загоняем в редактор  	invoke	SetWindowText, hEditControl, hMem$    ;освобождаем память  	invoke	SysFreeString, hMem$  ;закрываем файл  	invoke	CloseHandle, hFile    ;сформируем сообщение о длине файла  	invoke	lstrcpy, ADDR txtBuffer, ADDR szOpenedAt  	invoke	dwtoa, ln, ADDR sizeBuffer  	invoke	lstrcat, ADDR txtBuffer, ADDR sizeBuffer  	invoke	lstrcat, ADDR txtBuffer, ADDR bytes  ;выведем его в statusbar-е  	invoke	SendMessage, hStatus, SB_SETTEXT, 2, ADDR txtBuffer    	return	br		;вернем длину файла    Read_File_In endp    ;запрос подтверждения продолжения, когда в файле есть несохраненные изменения  ;вернет в eax MB_YES, MB_NO, MB_CANCEL  Confirmation	proc	hMain:DWORD    	szText	ConfirmMsg, "Файл не сохранен, сохранять будете ?"  	invoke	MessageBox, hMain, ADDR ConfirmMsg, ADDR szDisplayName,  			MB_YESNOCANCEL or MB_ICONQUESTION  	ret    Confirmation endp    ;сохраняем на диск  Write_2_Disk	proc	lpszFile_Name:DWORD    LOCAL	ln		:DWORD  LOCAL	hMem$ 		:DWORD  LOCAL	hFile 		:DWORD  LOCAL	bw		:DWORD  LOCAL	txtBuffer[64]	:byte  LOCAL	sizeBuffer[16]	:BYTE    ;создаем файд, если такой был, то его длина сбрасывается в 0  	invoke	CreateFile, lpszFile_Name,	; имя файла  		GENERIC_WRITE,			; доступ чтения/записи  		NULL,				; режим share  		NULL,				; security attributes  		CREATE_ALWAYS,			; как создавать  		FILE_ATTRIBUTE_NORMAL,		; аттрибуты файла  		NULL    	mov	hFile, eax			;сохраним handle файла    	invoke	GetWindowTextLength, hEdit	;читаем длину файла  	mov	ln, eax  	inc	ln				;+1 байт для завершающего 0    	invoke	SysAllocStringByteLen, 0, ln	;запрашиваем память  	mov	hMem$, eax    	invoke	GetWindowText, hEdit, hMem$, ln	;читаем в буфер содержимое файла    	dec	ln				;уберем завершающий 0  	invoke	WriteFile, hFile, hMem$, ln, ADDR bw, NULL ;пишем в файл    	invoke	SysFreeString, hMem$		;освобождаем память  	invoke	CloseHandle, hFile		;закрываем handle файла    ;помечаем, что файл не изменялся  	invoke	SendMessage, hEdit, EM_SETMODIFY, FALSE, 0    ;сформируем сообщение о длине файла  	invoke	lstrcpy, ADDR txtBuffer, ADDR szSavedAt  	invoke	dwtoa, ln, ADDR sizeBuffer  	invoke	lstrcat, ADDR txtBuffer, ADDR sizeBuffer  	invoke	lstrcat, ADDR txtBuffer, ADDR bytes    ;выведем его в statusbar-е  	invoke	SendMessage, hStatus, SB_SETTEXT, 2, ADDR txtBuffer    	return	bw	;вернем записанную длину    Write_2_Disk	endp    ;Сохранить как...  SaveFileAs proc  ;сбрасываем имя файла  	mov	szFileName, 0  ;запрашиваем имя файла  	invoke	SaveFileName, hWnd, ADDR szTitleS, ADDR szFilter  ;если было введено  	.if szFileName != 0	;0 будет при нажатии на cancel  ;сохраняем  		invoke	Write_2_Disk, ADDR szFileName  ;имя файла в заголовок окна  		invoke	SetWindowText, hWnd, ADDR szFileName  	.endif    	ret    SaveFileAs endp    ;сохранить  SaveFile proc    LOCAL	buffer[128]:BYTE    ;читаем заголовок (там имя файла)  	invoke	GetWindowText, hWnd, ADDR buffer, 128    ;проверим на имя "Untitled"  	invoke	lstrcmp, ADDR buffer, ADDR szUntitled  	.if eax == 0  		invoke	SaveFileAs	;если Untitled, то запросим имя,   		ret			; вызвав "сохранить как"  	.endif    	invoke	Write_2_Disk, ADDR buffer ;иначе, сохранить с тем же именем    	ret    SaveFile endp    ;смена режима переноса строк  WordWrap proc    LOCAL	mFlag	:DWORD  LOCAL	ln	:DWORD  LOCAL	hMem$	:DWORD    	invoke	SendMessage, hEdit, EM_GETMODIFY, 0, 0  	mov	mFlag, eax		;сохраним флаг изменения содержимого    	invoke	GetWindowTextLength, hEdit  	mov	ln, eax			;длина содержимого  	inc	ln			;+1 для 0    	invoke	SysAllocStringByteLen, 0, ln  	mov	hMem$, eax		;выделим память для буфера  	invoke	GetWindowText, hEdit, hMem$, ln	;читаем в буфер    	invoke	DestroyWindow, hEdit	;уничтожаем окно редактора!    ;меняем флаг Wrap на противоположный и выводим сообщение в статусе  	.if WrapFlag == 0  		mov	WrapFlag, 1  		invoke	SendMessage, hStatus, SB_SETTEXT, 1, ADDR WrapON  	.elseif WrapFlag == 1  		mov	WrapFlag, 0  		invoke	SendMessage, hStatus, SB_SETTEXT, 1, ADDR WrapOFF  	.endif    ;создаем окно редактора заново с измененным состоянием Wrap  	invoke	EditML, NULL, 0, 30, 300, 200, hWnd, 700, WrapFlag  	mov	hEdit, eax    ;сабклассинг окна  	invoke	SetWindowLong, hEdit, GWL_WNDPROC, EditProc  	mov	lpEditProc, eax    ;установим нужное положение и размер  	invoke	SendMessage, hWnd, WM_SIZE, 0, 0  ;восстановим содержимое редактора  	invoke	SetWindowText, hEdit, hMem$  ;освобождаем память буфера  	invoke	SysFreeString, hMem$  ;восстановим состояние флага модификации содержимого  	invoke	SendMessage, hEdit, EM_SETMODIFY, mFlag, 0  ;фокус ввода редактору  	invoke	SetFocus, hEdit    	ret    WordWrap endp    ;функция окна редактора при сабклассинге  EditProc	proc	hCtl	:DWORD,  			uMsg	:DWORD,  			wParam	:DWORD,  			lParam	:DWORD    ;анализируем коды интересующих нас клавиш  	.if uMsg == WM_KEYUP  		.if wParam == VK_F1		;F1 - Abort  			invoke	About  		.elseif wParam == VK_F9		;F9 - смена Wrap  			invoke	WordWrap  		.elseif wParam == VK_ESCAPE	;Escape - выход  			invoke	SendMessage, hWnd, WM_SYSCOMMAND, SC_CLOSE, NULL  			return	0  		.endif  	.endif  ;все остальное на основную функцию окна редактора  	invoke	CallWindowProc, lpEditProc, hCtl, uMsg, wParam, lParam    	ret    EditProc endp    ;about  About proc    ;заголовок  	szText	AboutMsg, "QEdit Text Editor"  ;стандартная функция вывода About  	invoke	ShellAbout, hWnd, ADDR szDisplayName, ADDR AboutMsg, hIcon    	ret    About endp    ;создание toolbar-а  Do_ToolBar	proc	hWin:DWORD  LOCAL	bSize	:DWORD  LOCAL	tbab	:TBADDBITMAP  LOCAL	tbb	:TBBUTTON    ;загружаем bitmap для toolbar-а  	invoke	LoadBitmap, hInstance, 750  	mov	hTbBmp, eax    ;создадим toolbar с кнопками 18х18  	Create_Tool_Bar	18, 18    	TBextraData	;дополнительные данные для структуры TBBUTTON    ;добавляем кнопки, параметры: индекс картинки в BitMap-е, ID кнопки  	TBbutton	4, 1000  	TBbutton	5, 1001  	TBbutton	6, 1002  	TBblank  	TBbutton	0, 1101  	TBbutton	1, 1102  	TBbutton	2, 1103  	TBbutton	3, 1100  	TBblank  	TBbutton	9, 1105  	TBblank  	TBbutton	7, 1900  	TBbutton	8, 1010    	ret    Do_ToolBar endp    ;подправим цвет BitMap-а  SetBmpColor	proc	hBitmap:DWORD    LOCAL	mDC		:DWORD  LOCAL	hBrush		:DWORD  LOCAL	hOldBmp		:DWORD  LOCAL	hReturn		:DWORD  LOCAL	hOldBrush 	:DWORD    	invoke	CreateCompatibleDC, NULL	;создаем совместимый DC  	mov	mDC,eax    	invoke	SelectObject, mDC, hBitmap	;выбираем в mDC картинку,  	mov	hOldBmp,eax			; старый сохраняем    	invoke	GetSysColor, COLOR_BTNFACE  	invoke	CreateSolidBrush, eax  	mov	hBrush, eax			;создаем кисть с цветом COLOR_BTNFACE    	invoke	SelectObject, mDC, hBrush	;выбираем  	mov	hOldBrush, eax			; старую сохраняем    	invoke	GetPixel, mDC, 1, 1		;читаем цвет пиксела (1,1)  ;закрашиваем все точки, равные цветом с (1,1) кистью COLOR_BTNFACE  	invoke	ExtFloodFill, mDC, 1, 1, eax, FLOODFILLSURFACE    ;восстанавливаем кисть  	invoke	SelectObject, mDC, hOldBrush  ;удаляем созданную кисть  	invoke	DeleteObject, hBrush  ;получим handle BitMap-а, для этого что-то выберем, а вернется нужный нам handle  	invoke	SelectObject, mDC, hBitmap  	mov	hReturn, eax		;сохраним  	invoke	DeleteDC, mDC		;удалим совместимый DC    	return	hReturn			;возвращаем handle подправленного BitMap-а    SetBmpColor endp    ;получение имени файла для чтения, с помощью стандартного диалога  GetFileName	proc	hParent:DWORD, lpTitle:DWORD, lpFilter:DWORD    	mov	ofn.lStructSize,sizeof OPENFILENAME  	m2m	ofn.hWndOwner,	hParent  	m2m	ofn.hInstance,	hInstance  	m2m	ofn.lpstrFilter,lpFilter  	m2m	ofn.lpstrFile,	offset szFileName  	mov	ofn.nMaxFile,	sizeof szFileName  	m2m	ofn.lpstrTitle,	lpTitle  	mov	ofn.Flags,	OFN_EXPLORER or OFN_FILEMUSTEXIST or \  				OFN_LONGNAMES    	invoke	GetOpenFileName, ADDR ofn    	ret    GetFileName endp    ;получение имени файла для записи, с помощью стандартного диалога  SaveFileName proc hParent:DWORD,lpTitle:DWORD,lpFilter:DWORD    	mov	ofn.lStructSize,sizeof OPENFILENAME  	m2m	ofn.hWndOwner,	hParent  	m2m	ofn.hInstance,	hInstance  	m2m	ofn.lpstrFilter,lpFilter  	m2m	ofn.lpstrFile,	offset szFileName  	mov	ofn.nMaxFile,	sizeof szFileName  	m2m	ofn.lpstrTitle,	lpTitle  	mov	ofn.Flags, 	OFN_EXPLORER or OFN_LONGNAMES  				  	invoke	GetSaveFileName, ADDR ofn    	ret    SaveFileName endp    ;создание статуса  Do_Status	proc	hParent:DWORD    LOCAL	sbParts[4]:DWORD    ;создаем окно статуса  	invoke	CreateStatusWindow, WS_CHILD or WS_VISIBLE or \  			SBS_SIZEGRIP,NULL, hParent, 200  	mov	hStatus, eax  	  ; sbParts - разбивает на 3 части  	mov	[sbParts +  0],	125	; пикселей слева  	mov	[sbParts +  4],	250	; -//-  	mov	[sbParts +  8],	-1	; до конца    	invoke	SendMessage, hStatus, SB_SETPARTS, 3, ADDR sbParts    	ret    Do_Status	endp    	end	start

Ресурсы:
#include  "\masm32\include\resource.h"    1   24      DISCARDABLE     "qedit.exe.manifest"    500 ICON MOVEABLE PURE LOADONCALL DISCARDABLE "QEDIT.ICO"    750 BITMAP MOVEABLE PURE LOADONCALL DISCARDABLE "TOOLBAR.BMP"    600	MENUEX MOVEABLE IMPURE LOADONCALL DISCARDABLE  BEGIN      POPUP "&File", , , 0      BEGIN          MENUITEM "&New",  1000          MENUITEM "&Open", 1001          MENUITEM "", , 0x0800 /*MFT_SEPARATOR*/          MENUITEM "&Save", 1002          MENUITEM "Save &As", 1003          MENUITEM "", , 0x0800 /*MFT_SEPARATOR*/          MENUITEM "&Exit", 1010      END      POPUP "&Edit",,,0      BEGIN          MENUITEM "&Undo\tCtrl+Z",1100          MENUITEM "", , 0x0800 /*MFT_SEPARATOR*/          MENUITEM "&Cut\tCtrl+X",1101          MENUITEM "C&opy\tCtrl+C",1102          MENUITEM "&Paste\tCtrl+V",1103          MENUITEM "", , 0x0800 /*MFT_SEPARATOR*/          MENUITEM "&Delete\tDelete",1104          MENUITEM "", , 0x0800 /*MFT_SEPARATOR*/          MENUITEM "&Wordwrap\tF9", 1105      END      POPUP "&Help", , , 0      BEGIN          MENUITEM "&About", 1900      END  END  

Весь проект здесь

Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 16.05.2010, 03:48
Рейтинг ответа:

НЕ одобряю 0 одобряю!

Консультация # 123274:

пожалуйсто помогите!ВОПРОС!!_работа с строчним оператором.сложить цифры в строку @str db "25".взять во внимание что код цифры 0 и символа "0" отличаются на 48

Дата отправки: 15.02.2008, 16:12
Вопрос задал: Richhabibi
Всего ответов: 2
Страница онлайн-консультации »


Консультирует Zetasm:

Здравствуйте, Richhabibi!

В приложении COM программа на MASM.

Приложение:

Консультировал: Zetasm
Дата отправки: 15.02.2008, 16:47
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Зенченко Константин Николаевич (Модератор):

Здравствуйте, Richhabibi!

C помощью строчного оператора STOSB формируется строка и выводится функцией DOS.
Если будут вопросы обращайтесь в мини-форум.
Удачи!

Приложение:

Консультировал: Зенченко Константин Николаевич (Модератор)
Дата отправки: 15.02.2008, 17:47
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!

 
     Прошлые выпуски
RFpro.ru: Ассемблер? Это просто! Учимся программировать RFpro.ru: Ассемблер? Это просто! Учимся программировать RFpro.ru: Ассемблер? Это просто! Учимся программировать Все выпуски рассылки
 
 
Subscribe.Ru / АО «Интернет-Проекты» / О компании / Политика конфиденциальности

Комментариев нет:

Отправить комментарий