본문 바로가기
WINapi

WIN32API 정리

by lolchangilsang 2022. 3. 31.

이 코드를 가지고 설명을 할 것이다!

 

일단 WINAPI를 만들 때는 타 언어 c언어 프로그램들이 main에서 시작하는 것과 비슷하게 WinMain에서 시작한다

 

main함수는 인수 사용 여부에 따라 인자가 달라지지만 WinMain은 아래와 같이 고정된다!

 

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance ,LPSTR lpszCmdParam,int nCmdShow)

위 코드에서 APIENTRY는 함수 호출 규약을 __stdcall로 사용한다는 뜻인데 지금 상황에서는 그리 중요하지 않다!

 

만약 궁금하다면 구글에 검색해 찾아보는 것을 추천한다!

 

이제 WinMain의 인수에 대해 설명을 해보도록 하겠다

 

인수 의미
hInstance 프로그램 인스턴스 '핸들'
hPrevInstance 바로 앞에 실행된 현재 프로그램의 인스턴스 핸들. 없을 경우는 NULL이 되며 WIN32에서는 항상 NULL이다. 호환성을 위해서만 존재하는 인수이므로 신경쓰지 않아도 된다.
lpCmdLine 명령행으로 입력된 프로그램 인수이다. 도스의 argv인수에 해당한다.
nCmdShow 프로그램이 실행될 형태이며 최소화, 보통모양 등이 전달된다.

일단 hlnstance는 프로그램 인스턴스 핸들이라고 하는데 말을 쉽게 바꿔서 프로그램을 구별해주는 핸들이라고 하겠다!

 

한 프로그램으로 여러 프로세스를 생성할 수 있다 하지만 같은 프로그램을 실행했으나 각각 다른 프로세스이기 때문에

 

컴퓨터는 프로세스를 구별하기 위해 핸들을 부여하는 것이다 프로세스가 시작할때 hlstance에 인자로 전달된다

 

두 번째는, 말 그대로 상관을 안써도 되니 바로 IpCmdline으로 넘어가 설명하도록 하겠다

 

IpCmdLine은 main의 char * argv[]와 비슷하다고 설명할 수 있다

 

그 전 강의에서 외우야하는 부분을 잘 외었다면 LPSTR은 char *를 typedef해 표현한다는 것을 알고 충분히 예측할 수 있

 

었을 것이라고 생각한다

 

위 예제 코드에서는 hLnstance를 전역변수 g_hInst에 저장해놓는다 위 코드에서는 따로 사용하지는 않지만 다음 강좌들

 

사용하게 될 때가 있을 것이다

 

이제 WndProc함수가 무엇인지 물어볼 수 있다 

 

WinMain함수는 프로그램을 시작시키고 윈도창을 뛰어주기만 하고 메시지(입력)에 대한 처리는 하지 않고 이 일은

 

WinProc함수에서 처리한다 그렇기에 WinMain의 함수의 모양은 대부분 일정하지만, WndProc함수가 많이 변화한다

 

그렇기에 WINAPI프로그램을 분석할때 WinMain을 분석하기 보다는 WndProc함수를 분석하는 것을 추천하다

 

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

굳이 이름을 바꾸고 싶다면 바꿔도 되지만 바꾸지 않는 것을 추천한다

 

여기서 CALLBACK은 __stdcall을 의미한다

 

오늘은 여기에서 마치도록 하겠다