OS/Windows API

Windows API :: int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) 의 의미

VallistA2016. 2. 12. 16:06

윈도우즈 API에서


"int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)"

와 같은 메인 함수를 발견할 수 있다.


이러한 함수가 무슨 역할을 하는지 궁금했는데, 이번 기회에 탐구하게 되어서 글을 적게 되었다.




WINAPI 란?


int 와 WinMain 사이에 있는 WINAPI는 무슨일을 할까?

WINAPI는 전처리기이면서, 포트란과 파스칼이 사용되던 시절부터 지금까지 쓰이는 매개 변수를 전달하는 방법이다.

즉, 일반적인 전달 방법은 오른쪽에서 왼쪽을 통과하지만 매개변수가 전달되는 순서를 반대로 하므로써 왼쪽에서 오른쪽으로 통과되게 하는 것이 WINAPI의 역할이다.


오른쪽과 왼쪽 이라는 표현이 이해가 안갈 수도 있는데 필자가 이해한 바에 따르면 아래와 같다.


다른 의미로는 변수를 반대로 읽는다는 것이 아닌,

변수에서 함수를 읽는게 아니라

함수에서 변수를 읽는다는 뜻이다.


즉 WinAPI Function 내부에서 Windows 를 Create 하면,


이렇게 하는 이유는 중요하지 않는데, 단순히 말하자면 윈도우는 이러한 방법을 필요로 한다는 것이다.


HINSTANCE hInstance


인스턴트 처리의 약어.

핸들 객체와 같은 것을 식별하는 32비트 정수이며 의미하는 인스턴스는 어플리케이션의 정보를 넘겨주는 사본이다.

멀티 태스킹 및 프로그램의 여러 복사본을 실행하는 기능을 윈도우에서 지원함에 따라서 윈도우 프로그램은 현재 포커싱이 무엇인지

현재 프로그램을 추척할 수 있는 방법이 필요함에 따라서 이러한 식별할 수 있는 기능을 parameter 에 넣어 놓았다.

프로그램이 시작되면 윈도우는 이 변수에 숫자를 수정해서 매개 변수로 넣어놓는다.


HINSTANCE hPrevInstance


이전 인스턴스에 대한 핸들을 의미한다.

열려있는 응용 프로그램의 여러 사본들이 있을때, 마지막 인스턴스의 핸들을 보관하는 의미.


Windows 95의 32비트 프로세서를 제공하던 때로 거슬러올라가면 여러 복사본은 동일한 메모리 공간을 공유하도록 했는데,

이 복잡한 것을 크게, 그리고 동일한 프로그램을 여러개 실행 및 유지하는 것이 그 당시 수많은 프로그래머들의 관심이었다.

이를 방지를 하기 위해서, hPrevInstance는 프로그래머가 실행중인 동일한 프로그램이 있는지 검색할 수 있도록 이전의 인스턴스 핸들이 있는 경우 반환하며, 없을 시 NULL을 반환한다.


그런데, 32비트 응용 프로그램이 이제 윈도우 자체 메모리 공간에서 각 응용 프로그램을 제공하기 때문에 hPrevInstance는 더이상 사용되지 않는다. 단지 버전과의 호환성을 위해 존재하고 다른 동일한 프로그램이 실행되어 있어도 모든 응용 프로그램에서 NULL을 반환한다.


이 변수는 이전 인스턴스를 검출하는 방법이지만, 가이드 라인의 범위를 벗어나므로 WinMain 함수를 MSDN 라이브러리에 검색해서 검출하는 방법에 대해서 자세히 알 수 있음.


LPSTR lpCmdLine


응용 프로그램의 정보에 대한 호출 명령 행을 포함하는 긴 문자열 포인터.

시작 메뉴의 명령 프롬프트에서 "MyApp.exe" 혹은 "MyApp.exe RunA" 그리고 "MyApp.exe RunB" 등으로 실행 가능하다.


이 parameter는 안전모드, 창모드, 소프트웨어 렌더링 모드, 치트 코드 모드 등 무엇이든 원하는 특수 모드를 실행하기 위한 프로그래밍에 유용하다!


INT nCmdShow


이 parameter는 창을 만들 때 표시하는 방법을 나타낸다.

예를 들자면, 최소화 최대화또는 정상인 윈도우를 호출할 수 있다.


몇가지 매개변수가 있는데 그 매개변수에 대해서는 MSDN 에서 검색해서 찾아보면 되겠다.



'OS > Windows API' 카테고리의 다른 글

__stdcall과 __cdecl의 차이점  (1) 2014.09.27
APIENTRY와 CALLBACK의 차이  (0) 2014.09.27
#9 Windows API 더블 버퍼링  (0) 2014.08.26
#8 Windows API (GDI+) 이미지 뿌리기  (0) 2014.08.26
#7 Windows API 선, 사각형, 원 뿌리기  (0) 2014.08.26

댓글

VallistA

병특이 끝나서 게임에서 웹으로 스위칭한 프로그래머.
프로그래밍 정보등을 공유합니다.
현재는 이 블로그를 운영하지 않습니다.
vallista.kr 로 와주시면 감사하겠습니다!

자고 싶습니다. ㅠㅠ

Github      :: 링크

궁금한점 문의 주시면 답변드리도록 하겠습니다

VISITED

Today :

Total :

SNS

  • 페이스북아이콘
  • 카카오톡아이콘
  • 트위터아이콘

Lately Post

Lately Comment