WIn32 API란, 32비트 윈도우즈 운영체제 응용프로그램을 만들기 위한, 마이크로소프트에서 제공해주는 라이브러리 셋이라고 보시면 됩니다. 일반적으로 처음 프로그래밍을 접할 때 만들어보는 응용프로그램들은 까만 화면에 흰 글자로 이루어진 콘솔 어플리케이션이라고 불리는 CUI 앱입니다. 하지만 윈도우에서 동작하는 프로그램들은 대부분 GUI기반 앱들이죠. 이러한 윈도우즈에서 동작하는 GUI 앱의 첫 발걸음인 Hello World를 만들어 보겠습니다.


일단 비주얼 스튜디오 2017를 실행하도록 합니다.


그리고 파일 - 새로만들기 - 프로젝트를 누릅니다.

아래와 같은 창이 나타나게 되는데요, Windows 데스크톱 마법사를 누릅니다.


응용 프로그램 종류를 Windows 응용 프로그램으로 선택하고, 추가 옵션에 빈 프로젝트를 체크합니다.



프로젝트를 생성하고, 소스파일에 main.c혹은 main.cpp 파일을 하나 추가합니다.


그리고 소스코드에 다음 내용을 붙여넣습니다.



#define WIN32_LEAN_AND_MEAN

#include <windows.h>
#include <tchar.h> 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) {
	MessageBox(NULL, _T("\tHello, World!"), _T("My First Win32 App"), NULL);
	return 0;
}


그리고 소스코드를 저장한 뒤, Ctrl + F5 키를 눌러서 빌드 및 실행을 해 봅니다.

다음과 같은 화면이 나타나면 성공!


이제 소스코드에 대한 간략한 설명을 해 보겠습니다.


첫번째 줄 #define WIN32_LEAN_AND_MEAN 이라는 구문은 불필요한 라이브러리들을 빌드에서 제외시키기 위한 내용이다. 빌드 시간을 줄일 수 있다. #include <windows.h> 를 선언하기 전에 define 해야 하며, 외부 MFC 헤더들을 포함시키지 않는다는 뜻입니다.


windows.h 는 메인 윈도우즈 헤더이며, Win32 API를 이용하여 앱을 작성할 시 필요합니다.

tchar.h 헤더는 _T(x)라는 매크로 함수를 사용하기 위해서 포함했다. _T(x)라는 매크로 함수는, 앱에서 유니코드 문자열 셋을 사용함에 따라 c언어에서 ascii 기반 char 배열형태의 문자열이 유니코드 기반 문자열과 호환되게 하는 매크로 함수이다. _T(x) 함수를 제거하고 프로그램을 실행할 시 에러메시지와 함께 컴파일이 안되는 모습을 확인할 수 있을 것입니다.


일반적인 콘솔 앱과는 달리 main 함수 대신 WinMain이라는 함수가 있다. 콘솔 앱에서 main함수와 같은 프로그램의 진입점(entry point)역할을 한다. WINAPI라고 되어 있는 부분은 해당 함수의 호출 규약(calling convention)을 규정해주는 구문이다. 호출 규약을 지정하지 않으면 C 호출 규약이 기본값으로 지정되게 된다. 윈도우즈 응용프로그램에서는 WINAPI 호출규약을 지정해야 합니다.


이제 WinMain 함수의 인자에 대해 알아보도록 합시다.

첫번째 인자 hInstance는 응용 프로그램의 인스턴스에 대한 핸들이다. 인스턴스란 실제 실행되어 메모리에 할당된 놈이라고 보면 된다. 실행되기 전 프로그램은 틀만 가지고 있을 뿐이고, 실행된 프로그램은 메모리를 할당받은 하나의 실체, 즉 인스턴스이다. 핸들이라고 하는 것은 해당 인스턴스에 개별적으로 부여된 아이디값 같은 것으로 보면 된다. 파일에 대한 핸들은 파일 디스크립터(File descriptor)라고 하듯이 윈도우 앱 프로세스에 대한 핸들은 hInstance 입니다.


두번째 인자인 hPrevInstance는 항상 NULL이다. 이 값은 Windows 3.1 시절에 사용되던 값으로, 가튼 앱의 다른 인스턴스가 이미 실행중이면 그 인스턴스의 핸들이 넘어 왔었습니다.


세번째 인자 IpCmdLine은 앱 실행 시 커맨드 라인 인자(Command Line Argument)를 담은 문자열 포인터이다. 예를들어 커맨드 라인에서 앱을 실행할 때 "HelloWorld.exe asdf -d 123" 이라는 명령어로 앱을 실행했다면, "asdf -d 123"이라는 문자열을 가리키게 됩니다.


제번째 인자인 nShowCmd는 앱이 실행된 후, 윈도우 상단 제목 줄에 나타날 앱의 제목을 결정합니다.



+ Recent posts