wWinMain

프로그램의 진입점 함수이다.

콘솔은 main 함수가 프로그램의 진입점 이지만, 앱은 wWinMain 함수가 프로그램의 진입점이다.

일반적으로 윈도우 생성, 메시지 루프, 윈도우 프로시저 처리 흐름을 포함한다.

// 전역 변수:
HINSTANCE hInst;                                // 현재 인스턴스입니다.
WCHAR szTitle[MAX_LOADSTRING];                  // 제목 표시줄 텍스트입니다.
WCHAR szWindowClass[MAX_LOADSTRING];            // 기본 창 클래스 이름입니다.

// 이 코드 모듈에 포함된 함수의 선언을 전달합니다:
ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // TODO: 여기에 코드를 입력합니다.

    // 전역 문자열을 초기화합니다.
    LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadStringW(hInstance, IDC_WINAPIUE, szWindowClass, MAX_LOADSTRING);
    MyRegisterClass(hInstance);

    // 애플리케이션 초기화를 수행합니다:
    if (!InitInstance (hInstance, nCmdShow))
    {
        return FALSE;
    }

    HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINAPIUE));

    MSG msg;

    // 기본 메시지 루프입니다:
    while (GetMessage(&msg, nullptr, 0, 0))
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

    return (int) msg.wParam;
}

image.png

매개변수

image.png

매개변수 자료형 설명
hInstance HINSTANCE 현재 실행 중인 애플리케이션의 인스턴스 핸들, 주로 리소스를 로드하거나 윈도우 클래스를 등록할 때 사용됨
실행 된 프로세스의 시작 주소를 의미한다.
hPrevInstance HINSTANCE 이전 인스턴스의 핸들. 항상 NULL
(이전 버전의 잔재, 현재 사용하지 않는 인자)
lpCmdLine LPWSTR 프로그램 실행 시 전달된 명령줄 인수 문자열, 유니코드 문자열 wchar_t* (현재 사용하지 않는 인자)
nCmdShow int 윈도우가 초기 표시 상태 (최대화, 최소화, 숨김 …)를 나타내는 값 SW_SHOW, SW_MINIMIZE

cf. hPrevInstance

초창기의 윈도우는 같은 프로세스 실행시 프로세스마다 주소를 가져 이전 인스턴스의 핸들이 필요했지만, 현대의 윈도우는 같은 프로세스를 실행할 때 같은 값의 hInstance 를 갖는다.

이는 윈도우가 가상 메모리라는 시스템을 사용하기 때문에 가능하며, 이와 같은 이유로 현재는 사용하지 않는 인자이다.

LoadStringW

image.png

프로젝트 리소스 테이블에서 문자 정보를 가져와 전역 문자열 szTitle, szWindowClass 를 초기화한다. 초기 프로젝트 세팅을 위해 존재하는 함수이다.

이 함수를 사용하지 않고 szTitle, szWindowClass 를 사용하는 곳에 직접 문자열을 입력해도 된다.

MyRegisterClass

image.png

윈도우 클래스 등록 함수. 윈도우의 스타일과 프로시저 등을 OS에 등록한다.

이때 등록한 윈도우 클래스는 실제 윈도우를 만들기 위한 설계도라고 볼 수 있다.

image.png