그냥 한번 어셈블리로 짜본겁니다.
거의 Template 수준이므로 다른 예제들과 다를바 없습니다.

컴파일은 요렇게 하시고
인용:
ml /c /coff mz.asm


링크는 요렇게 합니다.
인용:
link /SUBSYSTEM:WINDOWS mz.obj


단, masm v8.0 에서 테스트했으니 그외의 버젼은 장담 못합니다.
그리고 C:\masm32 에 설치되었다고 가정하고 만든것이기에
다른곳에 설치하셨다면 include, includelib 구문을 적당히 수정하시기 바랍니다.

코드:

COMMENT #
Copyright (C) 2005 Information Equipment co.,LTD.
All rights reserved.

Code by JaeHyuk Cho <mailto@minzkn@infoeq.com>
#

; Process type --------------------------------
.386                ; 386 CPU 사용 예고
.MODEL FLAT,STDCALL ; 표준 규칙
OPTION CASEMAP:NONE ; 반드시 필요함

; Window project default ----------------------
INCLUDE C:\masm32\include\windows.inc
INCLUDE C:\masm32\include\user32.inc
INCLUDE C:\masm32\include\kernel32.inc

;INCLUDE E:\masm32\include\windows.inc
;INCLUDE E:\masm32\include\user32.inc
;INCLUDE E:\masm32\include\kernel32.inc

; Link library --------------------------------
INCLUDELIB C:\masm32\lib\user32.lib
INCLUDELIB C:\masm32\lib\kernel32.lib
;INCLUDELIB E:\masm32\lib\user32.lib
;INCLUDELIB E:\masm32\lib\kernel32.lib


; Proto region --------------------------------
WinMain    PROTO :DWORD, :DWORD, :DWORD, :DWORD
WndProc    PROTO :DWORD, :DWORD, :DWORD, :DWORD

; Data select ---------------------------------
.DATA
g_instance DD 0
g_command_line DD 0
g_class_name DB "minzknWin32Engine", 0
g_title_name DB "당신은 누구요?", 0
g_confirm_exit DB "종료하려고요?", 0
g_confirm_exit_title DB "확인좀 하겠습니다.", 0
g_hello DB "어라? 윈도우 나올라구 그래.", 0

; Code zone -----------------------------------
.CODE
START: ; Win32 startup code
           INVOKE GetModuleHandle, NULL
           MOV g_instance, EAX
           INVOKE GetCommandLine
           MOV g_command_line, EAX
           INVOKE WinMain, g_instance, NULL, g_command_line, SW_SHOWDEFAULT
           INVOKE ExitProcess, eax
           JMP $

WinMain    PROC s_instance:DWORD,      ; 나는 누구다 !
                s_prev_instance:DWORD, ; 호환때문에
                s_command_line:DWORD,  ; 이것을 덧붙여서...
                s_command_show:DWORD   ; 어떻게 보여지라구?
           LOCAL s_window_class_ex : WNDCLASSEX ; 윈도우 학급 확장
           LOCAL s_message : MSG                ; 메세지전달 매개체
           LOCAL s_window : DWORD               ; 주 윈도우
         
           mov s_window_class_ex.cbSize, sizeof(WNDCLASSEX)
           mov s_window_class_ex.style, CS_HREDRAW OR CS_VREDRAW
           mov s_window_class_ex.lpfnWndProc, offset WndProc
           mov s_window_class_ex.cbClsExtra, NULL
           mov s_window_class_ex.cbWndExtra, NULL
           mov eax, s_instance
           mov s_window_class_ex.hInstance, eax
           mov s_window_class_ex.hbrBackground, COLOR_BTNFACE + 1
           mov s_window_class_ex.lpszMenuName, NULL
           mov s_window_class_ex.lpszClassName, offset g_class_name
           mov s_window_class_ex.hIcon, NULL
           mov s_window_class_ex.hCursor, NULL
           mov s_window_class_ex.hIconSm, 0
           INVOKE RegisterClassEx, ADDR s_window_class_ex

           ; Window 등록
           INVOKE CreateWindowEx,
                  0,
                  ADDR g_class_name,
                  ADDR g_title_name,
                  WS_OVERLAPPED OR WS_CAPTION OR WS_SYSMENU OR WS_MAXIMIZEBOX OR WS_MINIMIZEBOX OR WS_BORDER OR WS_THICKFRAME,
                  CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
                  NULL, NULL, s_instance, NULL
           mov s_window, eax
         
           ; 봐라
           INVOKE ShowWindow, s_window, SW_SHOWNORMAL
           ; 한번더 봐야되..
           INVOKE UpdateWindow, s_window

WinLoop:
           INVOKE GetMessage, ADDR s_message, NULL, 0, 0 ; 뭐가 도착했을까?
           or eax, eax
           jz WinExitLoop
           INVOKE TranslateMessage, ADDR s_message ; 키보드 니가 처리해
           INVOKE DispatchMessage, ADDR s_message ; WndProc 에게 나의 죽음을 알려라~
           jmp WinLoop
WinExitLoop:

           ; 내가 무슨 상태인지 상부에 보고하자~
           mov eax, s_message.wParam
           ret
WinMain    ENDP

; WinProc callback function -------------------
WndProc    PROC s_window:DWORD,
                s_message:DWORD,
                s_wparam:DWORD,
                s_lparam:DWORD
.if s_message == WM_CREATE
           ; 윈도우 생성했는데 뭐할까?
           INVOKE MessageBox, s_window, ADDR g_hello, ADDR g_hello, MB_OK OR MB_ICONQUESTION
           xor eax, eax
           ret
.elseif s_message == WM_CLOSE
           ; 윈도우 종료하기 직전인데...
           INVOKE MessageBox, s_window, ADDR g_confirm_exit, ADDR g_confirm_exit_title, MB_YESNO OR MB_ICONQUESTION
           CMP EAX, IDYES
           JNE ExitCancel
           INVOKE DestroyWindow, s_window ; 나 종료할려고 하는데...
ExitCancel:
           xor eax, eax
           ret
.elseif s_message == WM_DESTROY
           INVOKE PostQuitMessage, NULL ; 진짜 종료할거야...
           xor eax, eax
           ret
.endif   
           INVOKE DefWindowProc, s_window, s_message, s_wparam, s_lparam
           ret
WndProc    ENDP

           END START

; End of source
크리에이티브 커먼즈 라이센스
Creative Commons License
Writer profile
修身齊家治國平天下 (수신제가치국평천하)
匠人精神 (장인정신)
도구의 결함은 장인의 손으로 극복한다.
창조는 지식보다 위대하다.
2007/05/05 02:15 2007/05/05 02:15
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://blog.minzkn.com/rss/response/46

댓글+트랙백 ATOM :: http://blog.minzkn.com/atom/response/46

트랙백 주소 :: http://blog.minzkn.com/trackback/46

트랙백 RSS :: http://blog.minzkn.com/rss/trackback/46

트랙백 ATOM :: http://blog.minzkn.com/atom/trackback/46

댓글을 달아 주세요

댓글 RSS 주소 : http://blog.minzkn.com/rss/comment/46
댓글 ATOM 주소 : http://blog.minzkn.com/atom/comment/46
[로그인][오픈아이디란?]