다음을 통해 공유


WinMain 애플리케이션 진입점

모든 Windows 프로그램에는 WinMain 또는 wWinMain이라는 진입점 함수가 포함되어 있습니다. 다음 코드는 wWinMain에 대한 서명을 보여 냅니다.

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow);

4개의 wWinMain 매개 변수는 다음과 같습니다.

  • hInstance인스턴스에 대한 핸들 이거나 모듈에 대한 핸들입니다. 운영 체제는 이 값을 사용하여 메모리에 로드될 때 실행 파일 또는 EXE를 식별합니다. 특정 Windows 함수에는 인스턴스 핸들이 필요합니다(예: 아이콘 또는 비트맵 로드).
  • hPrevInstance는 의미가 없습니다. 16비트 Windows에서 사용되었지만 이제는 항상 0입니다.
  • pCmdLine에는 명령줄 인수가 유니코드 문자열로 포함되어 있습니다.
  • nCmdShow 는 기본 애플리케이션 창이 최소화, 최대화 또는 정상적으로 표시되는지 여부를 나타내는 플래그입니다.

함수는 값을 반환합니다 int . 운영 체제는 반환 값을 사용하지 않지만 값을 사용하여 상태 코드를 다른 프로그램에 전달할 수 있습니다.

와 같은 WINAPI호출 규칙은 함수가 호출자로부터 매개 변수를 받는 방법을 정의합니다. 예를 들어 호출 규칙은 매개 변수가 스택에 표시되는 순서를 정의합니다. 앞의 예제와 같이 wWinMain 함수를 선언해야 합니다.

명령줄 인수가 ANSI 문자열로 전달된다는 점을 제외하고 WinMain 함수는 wWinMain과 동일합니다. 유니코드 문자열이 선호됩니다. 프로그램을 유니코드로 컴파일하더라도 ANSI WinMain 함수를 사용할 수 있습니다. 명령줄 인수의 유니코드 복사본을 가져오려면 GetCommandLine 함수를 호출합니다. 이 함수는 단일 문자열의 모든 인수를 반환합니다. 인수를 argv 스타일 배열로 사용하려면 이 문자열을 CommandLineToArgvW에 전달합니다.

컴파일러가 표준 main 함수 대신 wWinMain을 호출하는 방법을 어떻게 알 수 있나요? 실제로 발생하는 것은 Microsoft CRT(C 런타임 라이브러리)가 WinMain 또는 wWinMain을 호출하는 main의 구현을 제공한다는 것입니다.

CRT는 기본 내에서 좀 더 많은 작업을 수행합니다. 예를 들어 wWinMain 전에 정적 이니셜라이저를 호출합니다. 링커에 다른 진입점 함수를 사용하도록 지시할 수 있지만 CRT에 연결하는 경우 기본값을 사용해야 합니다. 그렇지 않으면 CRT 초기화 코드를 건너뛰고 전역 개체와 같은 예측할 수 없는 결과가 올바르게 초기화되지 않습니다.

다음 코드는 빈 WinMain 함수를 보여줍니다.

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    PSTR lpCmdLine, int nCmdShow)
{
    return 0;
}

이제 진입점이 있고 몇 가지 기본 용어 및 코딩 규칙을 이해했으므로 첫 번째 Windows 프로그램을 만들 준비가 되었습니다.