2007. 1. 30. 15:45

래의 내용은 \Masm32\Include 폴더에 위치해서 프로그램에서는 그냥 인클루드시켜서 WinProc부분만
기재해서 사용한다. 대부분 공통적인 오버헤드부분이므로, 이런방식으로 사용하는것이 효율적이다.
물론 소스파일에 전부 넣어서 해도 마찬가지이나, 유지관리가 힘들어진다. 최대한 모듈로 분리해라!!
WinMain부분은 마음대로 바꿀 수 있으나, C프로그래머에게 익숙하게 변경했다. 어셈블리는 제한사항이 없다.
뭐든 맘대로 할 수 있다. WinMain에서는 사용할 클래스를 생성하고 등록한 후 메인 윈도우를 생성하고
메세지루프를 작동시키는 루틴이다. 주요 처리는 WinProc에서 처리될 것이다.
C와 같은 고급언어는 아래의 부분을 미리 생성해놓고 WinMain이라고 쓰라고 강요하고 있는 것이다.
실제로 _WinMain.c 라는 부분을 살펴보면 아래와 같은 내용의 C버전이 보인다. 하지만 변수처리나 로직부분
등 모든것이 조금 효율이 떯어진다. 속도로는 아직까지 아니 어떤시대라도 어셈블리를 따라올것이 없다.
거추장한것은 다 쳐내고 실제로 사용할 것만 효율적으로 사용하며, 그마저도 자기마음대로 바꿀 수 있다.

WinProc또한 이렇게 라이브러리로 따로 뺄 수 도 있으나 그것은 너무 혼란을 야기하므로 WinMain만 인클루드
시켜서 처리한다. 외양에 관한 부분은 따로 변수를 두었으니 변경할 수 있도록 처리했다.


;******************************* Usage for WinMain.INC  **************************************
;*********************************************************************************************
;*                     File Location is \MASM32\INCLUDE\WINMAIN.INC                          *
;*                                                                       2007.01 aka Xeno    *
;* ------ Modify You Source Contents.  ----------------------------------- *
;*                                                                                           *
;*     Win_Left    EQU  80                     ; 좌측 상단 X 좌표                            *
;*     Win_Top     EQU  60                     ; 좌측 상단 Y 좌표                            *
;*     Win_Width   EQU  640                    ; 윈도우 폭                                   *
;*     Win_Height  EQU  480                    ; 윈도우 높이                                 *
;*     Icon_ID     EQU  100                    ; 아이콘 ID (리소스에서 지정한 값)            *
;*     Menu_ID     EQU  200                    ; 메뉴   ID (리소스에서 지정한 값)            *
;*     BackColor   EQU  COLOR_WINDOW+1         ; 윈도우 바탕색 설정                          *
;*     CW_Style    EQU  WS_EX_OVERLAPPEDWINDOW ; 윈도우 형태                                 *
;*                                                                                           *
;*                    ------- Above WinProc Procedure. --------                              *
;*                                                                                           *
;*    INCLUDE     \MASM32\INCLUDE\WINMAIN.INC                                                *
;*                                                                                           *
;*********************************************************************************************


;-----------------------------------------------------------------------------------------
; Global Data Cell Routine

.DATA
;  UnComment Your Source
;       ClassName       DB  "WinMain_Class",00H     ; Customize Your Source
;       TitleName       DB  "Xeno Main",00H         ; Customize Your Source

        CommandLine     DD  00000000H              
        hInstance       DD  00000000H
        hWindow         DD  00000000H
        hIcon           DD  00000000H
        hMenu           DD  00000000H

        WinClass        WNDCLASSEX <>                ; Define Structure
        Msg             MSG        <>

;-----------------------------------------------------------------------------------------
; WinMain Routine - Program Entry Point

.CODE
WinMain:INVOKE  GetCommandLine             ; 명령어 라인 옵셋 얻기
        MOV     CommandLine,EAX

        INVOKE  GetModuleHandle,NULL       ; 인스턴스(모듈) 핸들 얻기
        MOV     hInstance,EAX
       
        MOV     WinClass.hInstance,EAX     ; WndClass.hInstance에 전달

        MOV     WinClass.cbSize,       SizeOf WNDCLASSEX
        MOV     WinClass.style,        CS_HREDRAW or CS_VREDRAW or CS_BYTEALIGNWINDOW
        MOV     WinClass.lpfnWndProc,  OFFSET WinProc
        MOV     WinClass.cbClsExtra,   NULL
        MOV     WinClass.cbWndExtra,   NULL
        MOV     WinClass.hbrBackground,BackColor
        MOV     WinClass.lpszMenuName, NULL
        MOV     WinClass.lpszClassName,OFFSET ClassName
        MOV     WinClass.hIconSm,NULL

        INVOKE  LoadIcon,hInstance,Icon_ID       ; 아이콘 ID
        MOV     WinClass.hIcon,EAX

        INVOKE  LoadCursor,NULL,IDC_ARROW        ; 커서 ID
        MOV     WinClass.hCursor,EAX

        INVOKE  LoadMenu,hInstance,Menu_ID       ;  메뉴 ID
        MOV     hMenu,EAX

        INVOKE  RegisterClassEx,ADDR WinClass    ; 윈도우 클래스 등록

; ----- CreateWindow Position Set -------------------------------------------

        INVOKE  CreateWindowEx,CW_Style,ADDR ClassName,       ; 윈도우 생성하고 핸들 얻음
                               ADDR TitleName,
                               WS_OVERLAPPEDWINDOW,
                               Win_Left,Win_Top,
                               Win_Width,Win_Height,                                          
                               NULL,NULL,hInstance,NULL
        MOV     hWindow,EAX                                    ; 윈도우 핸들 보관

; ----- ShowWindow Menu Handling -----------------------------------------

        INVOKE     SetMenu,hWindow,hMenu

        INVOKE     ShowWindow,hWindow,SW_SHOWNORMAL            ; 윈도우를 화면에 출력
        INVOKE     UpdateWindow,hWindow

; ----- Loop Message Handling -------------------------------------------

MsgLoop:INVOKE  GetMessage,ADDR Msg,NULL,0,0       ; 메시지 발생 대기
        OR      EAX,EAX                            ; 종료 코드 발생시
        JE      EndLoop                            ; 종료 루틴으로 점프
             
        INVOKE  TranslateMessage,ADDR Msg          ; 메시지 변환  (키보드)
        INVOKE  DispatchMessage,ADDR Msg           ; 메시지 전달  (WndProc)
        JMP     MsgLoop

EndLoop:INVOKE  ExitProcess,EAX                    ; 프로그램 종료

; ##############################################################################################

Posted by openserver