[Win32 API] WINAPI - 함수호출규약

WINAPI는 함수 호출 규약으로 windef.h에 정의 되어 있다.
기본적으로 _stdcall과 _cdecl 이 있는데 , 함수를 어떤 방식으로 호출할지 결정하는지 정한다.
  • _stdcall 
    • 함수 호출시 인자를 스택에 , 오른쪽에서 왼쪽순으로 저장한다. 
      • func(a,b,c) 라면 스택에 c를 넣고, b를 넣고, a를 넣는다.
    • 스택에 저장한 인자 메모리를 호출당한 쪽 함수에서 해제해 준다.
  • _cdecl 
    • 함수 호출시 인자를 스택에 오른쪽에서 왼쪽 순으로 저장한다. _stdcall과 동일
    • 스택에 저장한 인자 메모리를 호출한 쪽 함수에서 해제해 준다.
윈도우즈, 베이직,파스칼등 에서는 stdcall_이 default이다. 
하지만, c/c++에서는 _cdecl이 default이다. 
따라서, 코딩중 Win32 API함수를 호출하는 경우에는 명시적으로 _stdcall을 써줘야한다. 

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


라고 WINAPI라고 명시하면, _stdcall로 처리된다. WINAPI를 생략하게 되면, _cdecl로 간주되어 함수를 호출하게 되면 오류가 난다. 


댓글

이 블로그의 인기 게시물

JAVA Frame Icon setting

JAVA Spinner