(ASM)
 

-

:


:
;editor.asm
	.386			;  32- , , ,    Windows
	.model flat,stdcall	;    Windows
	option casemap:none	;     
	WinMain proto :DWORD,:DWORD,:DWORD,:DWORD ;  

;  
include		/masm32/include/windows.inc
include		/masm32/include/user32.inc
include		/masm32/include/kernel32.inc
include		/masm32/include/comdlg32.inc
includelib	/masm32/lib/user32.lib
includelib	/masm32/lib/kernel32.lib
includelib	/masm32/lib/comdlg32.lib

;
	.const
IDM_OPEN	equ	1	;  "open"
IDM_SAVE	equ	2	;  "save"
IDM_EXIT	equ	3	;  "exit"
MAXSIZE		equ	260	;   
MEMSIZE		equ	65535	;      

EditID		equ	1	;   "edit"

	.data			;  
ClassName	db	"Win32ASMEditClass",0	;  
AppName		db	"Win32 ASM Edit",0	; 
EditClass	db	"edit",0		;    
MenuName	db	"FirstMenu",0		;    
;,       
ofn		OPENFILENAME <>			; 
FilterString	db	"All Files",0,"*.*",0
		db	"Text Files",0,"*.txt", 0,0 ; 
buffer		db	MAXSIZE	dup(0)		;    

	.data?			;  
hInstance	HINSTANCE ?	;handle  
CommandLine	LPSTR	?	;  
hwndEdit	HWND	?	;handle 
hFile		HANDLE	?	;handle 
hMemory		HANDLE	?	;handle  
pMemory		DWORD	?	;   
SizeReadWrite	DWORD	?	;    /

	.code			; 
start:				; 
	invoke	GetModuleHandle, NULL	; handle  
	mov	hInstance, eax
	invoke	GetCommandLine		;   
	invoke	WinMain, hInstance ,NULL, CommandLine, SW_SHOWDEFAULT ;   (  Windows)
	invoke ExitProcess,eax		;      EAX

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

;  wc
	mov	wc.cbSize,SIZEOF WNDCLASSEX		; 
	mov	wc.style, CS_HREDRAW or CS_VREDRAW	; 
	mov	wc.lpfnWndProc, OFFSET WndProc		; 
	mov	wc.cbClsExtra, NULL			;   
	mov	wc.cbWndExtra, NULL			;       
	push	hInst
	pop	wc.hInstance				;handle  
	mov	wc.hbrBackground, COLOR_WINDOW+1	;
	mov	wc.lpszMenuName, OFFSET MenuName	; 
	mov	wc.lpszClassName, OFFSET ClassName	; 
	invoke	LoadIcon, NULL, IDI_APPLICATION		;  
	mov	wc.hIcon, eax				;     (3232)
	mov	wc.hIconSm, eax				;1616 
	invoke	LoadCursor, NULL, IDC_ARROW		;    -  
	mov	wc.hCursor, eax
	invoke	RegisterClassEx, addr wc		;  

;  
	INVOKE	CreateWindowEx, WS_EX_CLIENTEDGE, ADDR ClassName, ADDR AppName,\\\\\\\\
		WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,\\\\\\\\
		CW_USEDEFAULT, 300, 200, NULL, NULL, \\\\\\\\
		hInst, NULL
	mov	hwnd, eax				; handle 
	
	INVOKE	ShowWindow, hwnd, SW_SHOWNORMAL		; 
	INVOKE	UpdateWindow, hwnd			;

;  
.WHILE TRUE						; 
	INVOKE	GetMessage, ADDR msg, NULL, 0, 0	;    
.BREAK .IF (!eax)					; EAX = 0,   ( invoke PostQuitMessage, NULL)
	INVOKE	TranslateMessage, ADDR msg		;      
	INVOKE	DispatchMessage, ADDR msg		;     
.ENDW
	mov	eax,msg.wParam				; 
	ret
WinMain endp

; 
WndProc	proc uses ebx hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
; 
.IF uMsg==WM_CREATE					;    
;    "edit"
	INVOKE	CreateWindowEx, NULL, ADDR EditClass, NULL,\\\\\\\\
		WS_VISIBLE or WS_CHILD or ES_LEFT or ES_MULTILINE or\\\\\\\\
		ES_AUTOHSCROLL or ES_AUTOVSCROLL, 0,\\\\\\\\
		0, 0, 0, hWnd, EditID,\\\\\\\\
		hInstance, NULL
	mov	hwndEdit, eax				; handle 
	invoke	SetFocus, hwndEdit			;     
;    
	mov	ofn.lStructSize, SIZEOF ofn		; 
	push	hWnd
	pop	ofn.hWndOwner				;handle -
	push	hInstance
	pop	ofn.hInstance				;handle  
	mov	ofn.lpstrFilter, OFFSET FilterString	; -
	mov	ofn.lpstrFile, OFFSET buffer		; ,    
	mov	ofn.nMaxFile, MAXSIZE			;    

.ELSEIF uMsg==WM_SIZE					;      
	mov	eax, lParam				;  
	mov	edx, eax
	shr	edx, 16					; 
	and	eax, 0ffffh				; 
	invoke	MoveWindow, hwndEdit, 0, 0, eax, edx, TRUE ;     

.ELSEIF uMsg==WM_DESTROY				;,    
	invoke PostQuitMessage,NULL			;    

.ELSEIF uMsg==WM_COMMAND				;    ,     ..
	mov eax, wParam					; 
.if lParam==0						;   ...
.if ax==IDM_OPEN					; "open"
	mov ofn.Flags,	OFN_FILEMUSTEXIST or \\\\\\\\		;   
			OFN_PATHMUSTEXIST or OFN_LONGNAMES or\\\\\\\\
			OFN_EXPLORER or OFN_HIDEREADONLY
	invoke	GetOpenFileName, ADDR ofn		;       
.if eax==TRUE						; - , 
							;      buffer
	invoke	CreateFile, ADDR buffer,\\\\\\\\
		GENERIC_READ or GENERIC_WRITE ,\\\\\\\\
		FILE_SHARE_READ or FILE_SHARE_WRITE,\\\\\\\\
		NULL, OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE,\\\\\\\\
		NULL
	mov	hFile, eax				; handle 

;      
	invoke	GlobalAlloc, GMEM_MOVEABLE or GMEM_ZEROINIT, MEMSIZE ;  
	mov	hMemory, eax				; handle 
	invoke	GlobalLock, hMemory			;""  
	mov	pMemory, eax				;      

;     MEMSIZE-1 
	invoke	ReadFile, hFile, pMemory, MEMSIZE-1, ADDR SizeReadWrite, NULL

;      
	invoke	SendMessage, hwndEdit, WM_SETTEXT, NULL, pMemory

	invoke	CloseHandle, hFile			; 
	invoke	GlobalUnlock, pMemory			;  
	invoke	GlobalFree, hMemory			;  
.endif	;eax=TRUE
	invoke	SetFocus, hwndEdit			;   

.elseif ax==IDM_SAVE					; "save"
	mov	ofn.Flags,OFN_LONGNAMES or\\\\\\\\
		OFN_EXPLORER or OFN_HIDEREADONLY
	invoke	GetSaveFileName, ADDR ofn		;       
.if eax==TRUE						; - 
							;      buffer
	invoke 	CreateFile, ADDR buffer,\\\\\\\\
		GENERIC_READ or GENERIC_WRITE ,\\\\\\\\
		FILE_SHARE_READ or FILE_SHARE_WRITE,\\\\\\\\
		NULL, CREATE_NEW, FILE_ATTRIBUTE_ARCHIVE,\\\\\\\\
		NULL
	mov	hFile, eax				; handle 

;           
;      "open"
	invoke	GlobalAlloc,GMEM_MOVEABLE or GMEM_ZEROINIT,MEMSIZE
	mov	hMemory, eax
	invoke	GlobalLock, hMemory
	mov	pMemory, eax
;    ( EAX   )
	invoke	SendMessage, hwndEdit, WM_GETTEXT, MEMSIZE-1, pMemory
;  
	invoke	WriteFile, hFile, pMemory, eax, ADDR SizeReadWrite, NULL
	invoke	CloseHandle, hFile
	invoke	GlobalUnlock, pMemory
	invoke	GlobalFree, hMemory
.endif	;eax=TRUE
	invoke	SetFocus, hwndEdit

;         
.else
	invoke	DestroyWindow, hWnd
.endif	;   WM_COMMAND  AX
.endif	;if lParam==0  WM_COMMAND

.ELSE	;    
	invoke	DefWindowProc, hWnd, uMsg, wParam, lParam
	ret
.ENDIF	; uMsg
	xor	eax, eax	;,      
	ret
WndProc	endp
	end	start		;  


  
  
ИИ Разработка лекарств