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는 앱이 실행된 후, 윈도우 상단 제목 줄에 나타날 앱의 제목을 결정합니다.



OpenGL을 사용한 예제 프로그램을 구동해보도록 하겠다. 일단 실행환경은 다음과 같다.


- Windows 10 64bit

- Microsoft Visual Studio 2017 Community

- GLUT


GLUT은 다음 링크에서 다운받을 수 있다.

https://www.opengl.org/resources/libraries/glut/glutdlls37beta.zip


GLUT 라이브러리를 다운로드 받아서 압축을 풀면 다음과 같이 나타나게 된다.




예제들은 다음 링크에 있는 녀석들을 참조할 예정이다.

https://www.opengl.org/archives/resources/code/samples/glut_examples/examples/examples.html


일단 비주얼 스튜디오를 실행한다.






상단 메뉴에서 파일 - 새로 만들기 - 프로젝트 를 실행한다.

Win32 콘솔 응용프로그램이라는 항목이 있으면 그녀석을 선택하면 되는데, Windows 콘솔 응용프로그램이 있다. 

이 경우 좌측의 Windows 데스크톱을 눌러서 Windows 데스크톱 마법사를 통하여 프로젝트를 생성해주도록 한다.





Windows 데스크톱이라는 항목을 선택한 모습이다. 가장 아래에 Windows 데스크톱 마법사라는 항목이 나타나게 된다. 그냥 Windows 콘솔 응용 프로그램을 선택할 경우 '빈 프로젝트'라는 옵션이 나타나지 않게 된다.


Windows 데스크톱 프로젝트라는 추가 설정 창이 나타나게 되는데, 추가 옵션에 '빈 프로젝트'라는 항목에 체크를 해 주도록 한다. 그리고 프로젝트를 생성한 뒤, 프로젝트가 생성된 디렉토리로 이동하도록 한다. 기본 설정에 따라서  C:\Users\<유저명>\source\repos 라는 디렉토리에 Visual Studio 프로젝트가 생성되었다.





그리고 다운받은 GLUT에 들어있는 파일들을 아래와 같이 디렉토리를 만들어서 구성해주도록 한다. opengl_ex는 프로젝트를 생성해서 나타난 디렉토리이고, 같은 레벨에 3rd_party라는 디렉토리를 만든다.


그리고 3rd_party라는 디렉토리 하위에 GLUT이라는 디렉토리를 만든다.

그리고 GLUT이라는 디렉토리 하위에 GL이라는 디렉토리를 만들고, 같은 레벨에 glut.lib, glut32.lib 파일을 복사해서 집어넣어준다.

그리고 GL 디렉토리 안에는 glut.h 파일을 복사해서 집어넣어준다.


그리고 나서 Visual Studio에서 해당 외부 라이브러리 포함에 관련된 설정을 해 주어야 한다.





아래 그림에서 프로젝트 이름에 마우스 오른쪽 버튼을 눌러서 속성을 누른다.


그러면 아래와 같은 창이 뜨게 되는데, C/C++라는 필드가 보이지 않는 경우가 있다. 이러한 경우 소스코드를 하나 추가해주면 해당 필드가 나타나게 된다. 따라서 아래 창을 끄고 이전 화면으로 돌아간다.

소스파일이란 항목에 마우스 오른쪽 버튼을 클릭해서 추가 - 새 항목을 누른다.

C++ 파일을 선택하고 파일명에 main.cpp라고 작성한 뒤 추가를 누른다. 사실 구동해보려는 예제 코드가 c 소스코드이므로 main.c 라고 해도 무방하다.






openGL 예제코드가 있는 사이트에서 아무 코드나 고른다.

URL https://www.opengl.org/archives/resources/code/samples/glut_examples/examples/examples.html

선택한 소스코드를 Ctrl + A 키를 눌러서 모두 선택한 뒤 복사한다.


생성한 소스코드 파일에 고스란히 붙여넣기 한다.

그리고 다시 프로젝트에 마우스 오른쪽 버튼을 눌러서 속성 탭을 띄우면 C/C++라는 필드가 활성화 된 것을 볼 수 있다. C/C++ - 일반 탭에서 추가 포함 디렉터리 항목에 다음과 같이 입력한다.


../../3rd_party/GLUT/;

추가한 디렉토리 경로와 일치하는 것을 알 수 있다.

그리고 링커 - 일반 탭에서 추가 라이브러리 디렉터리에도 아래와 같이 입력한다.

../../3rd_party/GLUT/

링커 - 입력 탭에서 추가 종속성 탭의 오른쪽 끝에 있는 아래 꺽쇠를 누른다.


나타난 매뉴 중 <편집..> 을 누른다.



아래와 같이 3개의 항목을 추가해준다.

opengl32.lib

glu32.lib

glut32.lib


확인을 누르고 적용 버튼을 누른 뒤 변경사항을 저장한다.

그리고 main.c파일이 있는 곳에 dll파일들을 붙여넣기 해 준다. glut.dll 파일과 glut32.dll파일이 있다.




그리고 프로젝트 화면에서 Ctrl + F5를 누르면 정상적으로 실행되게 된다.




마이크로소프트사에서 개발한 대표적인 IDE인 비주얼 스튜디오(Microsoft Visual Studio)는 강력한 IDE입니다. 주로 C/C++언어 개발을 지원하지만, 최근에는 C#을 이용한 데스크탑 앱 등 다양한 언어와 어플리케이션을 지원합니다.


원래 수백만원대의 라이센스 비용을 지불해야지만 사용할 수 있는 IDE였으나, 마이크로소프트사에서 돈을 많이 벌어서 무료버전인 Community Edition을 제공합니다. 해당 IDE를 한번 설치해보도록 하겠습니다.


아래의 링크로 이동합니다.

https://www.visualstudio.com/ko/free-developer-offers/

우리가 설치할 것은 Visual Studio Community Edition이므로 가장 좌측에 보이는 '다운로드'를 클릭합니다. 그러면 잠시 뒤 아래와 같은 화면이 나타나면서 vs_Community 라는 파일이 다운로드되게 됩니다.

다운받은 파일을 실행하면 다음과 같은 화면이 나옵니다. '계속'을 눌러줍니다.


vs_Community 라는 파일은 PC에 비주얼 스튜디오를 설치하도록 하는 클라이언트 앱입니다. 대신 설치해주는 프로그램이라고 보시면 됩니다. 조금 기다리면 다음과 같은 화면이 나타나게 됩니다. 어떠한 용도로 Visual Studio 를 설치하느냐에 따라 선택사항이 달라질 수 있습니다.


저 같은 경우는 C++을 이용한 데스크탑 앱 개발 및 DirectX를 이용한 게임 개발이 목적이므로, 두개를 체크했습니다. 설치크기가 수백 MB에서 갑자기 5GB가량으로 올랐습니다. 용도를 선택하면 필요한 의존 라이브러리 등을 알아서 다 설치를 해 줍니다. 필요없는 것 까지 선택을 하면 용량을 많이 사용하고, 설치 시간도 많이 걸리게 됩니다. 필요최소한 내용을 선택해서 설치하시면 됩니다.

위와 같이 설치과정 화면이 나타나게 됩니다. 


완료되면 다음과 같은 화면이 나타나며 컴퓨터를 재시작하면 계속해서 설치가 이어지게 됩니다.




시작 메뉴에서 검색을 해서, Visual Studio를 실행합니다.



로그인을 하면 다양한 기능을 제공해준다고 하네요. 저는 일단 이 기능을 사용하지 않고 사용하도록 '나중에 로그인'을 눌렀습니다.


위와 같은 화면이 나타나는데요. 테마는 본인이 기호에 맞게 설정하시면 되고, 개발 설정은 개발하려는 앱의 형태에 따라서 고릅니다. 저는 C++ 어플리케이션을 개발할 것이므로, C++ 을 선택했습니다. 혹시 C언어로 개발하실 분도 C++를 선택하셔도 무방합니다.



Visual Studio가 실행된 모습입니다. 이제 마음껏 개발하시면 됩니다.

+ Recent posts