「MASM32/WinApp」の編集履歴(バックアップ)一覧に戻る

MASM32/WinApp - (2019/09/04 (水) 09:52:06) のソース

WinApp.asm
#highlight(asm){{
comment *
	MASM32 SDK
ml /c /coff WinApp.asm
link /subsystem:windows WinApp
*

.386
.model flat, stdcall
option casemap:none

include windows.inc
include gdi32.inc
include kernel32.inc
include user32.inc

includelib gdi32.lib
includelib kernel32.lib
includelib user32.lib

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

.data
AppName	db	'WinApp', 0
hello	db	'hello, world', 0

.code

start	proc
	local	hInstance:HINSTANCE
	local	lpCmdLine:LPSTR

	invoke	GetModuleHandle, NULL
	mov	hInstance, eax
	invoke	GetCommandLine
	mov	lpCmdLine, eax
	invoke	WinMain, hInstance, NULL, lpCmdLine, SW_SHOWDEFAULT
	invoke	ExitProcess, eax
start	endp

WinMain	proc	hInstance:HINSTANCE, hPrevInstance:HINSTANCE, lpCmdLine:LPSTR, nShowCmd:DWORD
	local	wc:WNDCLASSEX
	local	msg:MSG
	local	hWnd:HWND

	; ウィンドウクラスの登録
	mov	wc.cbSize, sizeof WNDCLASSEX
	mov	wc.lpfnWndProc, offset WndProc
	mov	wc.cbClsExtra, 0
	mov	wc.cbWndExtra, 0
	mov	eax, hInstance
	mov	wc.hInstance, eax
	mov	wc.hIcon, 0
	invoke	LoadCursor, NULL, IDC_ARROW
	mov	wc.hCursor, eax
	mov	wc.hbrBackground, COLOR_WINDOW+1
	mov	wc.lpszMenuName, 0
	mov	wc.lpszClassName, offset AppName
	mov	wc.hIconSm, 0
	invoke	RegisterClassEx, addr wc

	; ウィンドウの作成
	invoke	CreateWindowEx,
		0, addr AppName, addr AppName,
		WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT, 0,
		CW_USEDEFAULT, 0,
		NULL, NULL, hInstance, NULL
	mov	hWnd, eax
	invoke	ShowWindow, hWnd, nShowCmd
	invoke	UpdateWindow, hWnd

@@:	; メッセージループ
	invoke	GetMessage, addr msg, NULL, 0, 0
	or	eax, eax
	jz	@f
	invoke	TranslateMessage, addr msg
	invoke	DispatchMessage, addr msg
	jmp	@b
@@:
	mov	eax, msg.wParam
	ret
WinMain	endp

WndProc	proc	hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
	cmp	uMsg, WM_PAINT
	jne	@f
	invoke	OnPaint, hWnd
	jmp	@exit
@@:
	cmp	uMsg, WM_DESTROY
	jne	@f
	invoke	PostQuitMessage, 0
	jmp	@exit
@@:
	invoke	DefWindowProc, hWnd, uMsg, wParam, lParam
	ret
@exit:
	xor	eax, eax
	ret
WndProc	endp

OnPaint	proc	hWnd:HWND
	local	ps:PAINTSTRUCT
	local	hdc:HDC
	local	len:DWORD

	invoke	BeginPaint, hWnd, addr ps
	mov	hdc, eax

	invoke	lstrlen, addr hello
	mov	len, eax
	invoke	TextOut, hdc, 0, 0, addr hello, len

	invoke	EndPaint, hWnd, addr ps
	ret
OnPaint	endp

end	start
}}

#image(WinApp.jpg)