API 기본적인 기능

Gloz·2022년 11월 8일
0

API에 대한 내용

목록 보기
1/11

API란?

(Application Programming Interface)

  • 운영체제가 응용 프로그램 개발을 위해 제공하는 서브루틴 또는 함수의 집합이라고 한다.

  • 명령어의 집합으로 어플리케이션 프로그램에서 오퍼레이팅 시스템의 기본적인 기능을 사용할 필요가 있을 경우 API에서 명령어 호출이 진행된다.

  • 가장 근본적인 녀석임.

즉, 하드웨어 --------- 운영체제 (Windows) --------- 응용프로그램


이런 방식인데, 여기서 기본적으로 API는 그래픽 카드가 지원이 안된다.




▷ 장점

  • 운영체제가 같으면 같은 기능의 집합을 사용하기에 확장성 및 연동성, 그리고 유지보수가 편리하다
    ㄴ 윈도우즈 != 리눅스
    ( 윈도우즈에서 리눅스로 넘어갈거라면 헤더파일에 추가만 한다면 가능하지만, 리눅스에서 윈도우즈로 넘어가는 것은 불가능하다.)

  • 윈도우즈에서 지원하는 다양한 라이브러리 지원 가능

▷ 단점

  • 플랫폼이 고착화 ( Win API 자체가 C언어로 만들어져서 굉장히 오래되었음 )

▶ API 구조

  • API는 크게 진입점, 메세지 루프, Window Procedure로 나뉜다.

이 세가지를 기억해야한다.!! ★★★★★★★★★★★★




API에서의 기본적인 용어

  • 인스턴스

    • 윈도우 OS가 현재 실행되고 있는 프로그램을 확인하기 위한 값

    • 같은 프로그램이면 같은 인스턴스 값을 가진다.

    • 실행되고 있는 각각의 프로그램들을 의미

      즉, 인스턴스라 함은 프로그램에 대한 정보라고 생각하면 된다.

  • 윈도우 핸들

    • 윈도우 창을 의미한다. -> 그 창에 대한 정보를 담은 데이터



  • LPSTR, LPCSTR, LPCTSTR -> 각각 char 포인터, const char 포인터, t char 포인터를 의미한다.



▶ TCHAR

  • TCHAR형은 프로젝트의 문자셋 설정에 따라 자동적으로 char또는 wchar_t로 type casting 되는 중간 매크로 자료형이다.

  • 멀티 바이트와 유니 코드 환경에서 별도의 수정 작업 없이 프로그램을 구동하기 위해서는 TCHAR형으로 문자열을 표현하는걸 추천

  • 일반적으로 윈도우 응용 프로그램에서 문자열 상수를 쓰기 위해서는 중간 설정에 따라 char 포인터 또는 wchar_t 포인터 로 변환해주는 _T 매크로를 사용해야 한다.

※ 영어가 아닌 다른 문자들을 표현할 때는 영어라면 1byte로 표현하나 다른것들은 2byte로 표현이 되므로 이를 해결하기 위해서 유니 코드( Unicode ) 를 사용하는데, 유니코드는 모든 문자 집합을 지원한다.


hInstance : 프로그램 인스턴스 핸들
hPrevInstance : 이전에 실행된 인스턴스 핸들
lpszCmdParam : 명령형으로 입력된 프로그램 인수(자)
nCmdShow : 프로그램이 시작될 형태 ( 최소화 or 보통 크기 등등... )

// 진입점 (윈도우 메인함수)
int APIENTRY WinMain( HINSTANCE hInstance,
                      HINSTANCE hPrevInstance,
                      LPSTR lpszCmdParam,
                      int nCmdShow)

▶ WinMain의 역할

  1. 윈도우 창을 셋팅 후 화면에 띄우기
    ㄴ 화면에 창을 띄우기 위해서는 4가지를 모두 처리해야 한다.

    • WndClass 정의
      ㄴ 윈도우 창 구조체 선언 및 초기화

      WNDCLASS wndClass;
      
       wndClass.cbClsExtra = 0;                                             // 클래스 여분 메모리
       wndClass.cbWndExtra = 0;                                             // 윈도우 여분 메모리 -> 이 여분 메모리들은 우리는 게임을 만들기 때문에 동적할당으로 이용해서 안씀
       wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);        // 백그라운드
       wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);                      // 마우스 커서 -> 윈도우에서 지원하고 있는 화살표를 쓸것임. (NULL은 이미지를 쓰지 않는다는것)
       wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);                    // 아이콘 -> 아이콘은 쓰지 않겠다고 NULL을 입력함. application에 지원하는 것을 쓰겠다.
       wndClass.hInstance = hInstance;                                      // 윈도우를 소유한 프로그램의 식별자 정보
       wndClass.lpfnWndProc = (WNDPROC)WndProc;                             // 윈도우 프로시저 -> 우리가 쓰고 있는 procedure를 쓰겠다. 일단 강제치환해서 씀
       wndClass.lpszClassName = _lpszClass;                                 // 클래스 이름 (윈도우 클래스 식별자 정보를 뜻한다.)
       wndClass.lpszMenuName = NULL;                                        // 메뉴 이름
       wndClass.style = CS_HREDRAW | CS_VREDRAW;                            // 윈도우 스타일 (윈도우 다시 그리기 정보)

    • WndClass 등록

      RegisterClass(&wndClass);

    • 윈도우 생성
      ㄴ 화면에 보여줄 윈도우 창 생성

      _hWnd = CreateWindow
       (
           _lpszClass,                 // 윈도우 클래스 식별자
           _lpszClass,                 // 윈도우 타이틀 바 이름
           WS_OVERLAPPEDWINDOW,        // 윈도우 스타일
           400,                        // 윈도우 화면 X좌표
           100,                        // 윈도우 화면 Y좌표
           800,                        // 윈도우 화면 가로크기
           800,                        // 윈도우 화면 세로크기
           NULL,                       // 부모 윈도우 GetDesktopWindow() 이게 더 안전하긴함
           (HMENU)NULL,                // 메뉴 핸들
           hInstance,                  // 인스턴스 지정
           NULL                        // 윈도우의 자식 윈도우를 생성하면 지정하고 아니라면 NULL
                                       // ㄴ 필요에 의해서 사용하지만 지금은 NULL
       );

    • 윈도우 출력
      ㄴ 화면에 윈도우 창 보여주기

      ShowWindow(_hWnd, nCmdShow);
  2. 메세지 루프

    // MSG: 운영체제에서 발생하는 메세지 정보를 저장하기 위한 구조체
    MSG message;





▶ 메세지의 종류

  1. GetMessage
    ㄴ 메세지를 꺼내올 수 있을때까지 멈춰있는 함수
    ㄴ GetMessage 함수는 메세지 큐로부터 하나의 메세지를 가져오는 역할을 한다.
    ㄴ 단, 메세지 큐가 비어있을 경우 (즉, 발생한 메세지가 없을 경우) 메세지가 들어올때까지 대기.
  • 장점: 안정적이다. (메세지가 하나씩 들어오기 때문에)

  • 단점: 다량의 데이터를 처리하기에는 부족하다.


  1. PeekMessage
    ㄴ 메세지가 없더라도 반환되는 함수
  • 이 메세지를 사용하기 위해서는 고성능 타이머가 필요하다.
// 메세지 루프
while (GetMessage(&message, 0, 0, 0))
    {
        TranslateMessage(&message);
        DispatchMessage(&message);
    }
  • TranslateMessage : 키보드에서 입력 메세지 처리를 담당, 입력된 키가 문자키인지 확인 후 대문자 혹은 소문자, 한글, 영문인지에 대한 WM_CHAR 메세지를 발생 시킨다.

  • DispatchMessage : 윈도우 프로시저에서 전달된 메세지를 실제 윈도우로 전달




LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
  • 콜백함수 (CallBackFunction) : 사용자가 호출하는 것이 아닌, 운영체제에 의해 호출된 함수

  • 윈도우 프로시저

  • LRESULT가 반환형인 CallBack함수로 4개의 인수를 가지고 있다.



▶ Window Procedure

  • 메세지를 운영체제에 전달 -> 강제로 운영체제가 호출 해준다.
    ㄴ WinMain 이 아닌, 운영체제에 의해 호출되는 콜백 함수
    ㄴ 윈도우를 생성할 때는 반드시 지정을 해줘야한다.

※ 윈도우 프로시저 내부에서는 윈도우에서 발생한 모든 메세지를 처리하는 것이 아니라 특정 메세지만을 처리하고 나머지 메세지는 DefWindowProc 함수가 처리하도록 로직을 설계하는 것이 일반적이다.

hWnd : 어느 윈도우에서 발생한 메세지인지 구분

iMessage : 메세지 구분 번호

wParam : unsigned int 마우스 버튼의 상태, 키보드 조합 키의 상태를 전달

lParam : usingned long 마수으 클릭 좌표를 전달


    switch (iMessage)
    {
        // 윈도우 메세지 크리에이트, 생성자 느낌이 난다.
    case WM_CREATE:             // 생성자
        break;


    case WM_DESTROY:            // 소멸자
        /*
        PostQuitMessage 함수는 메세지 큐에 Quit 메세지를 보내는 역할을 한다.
        즉, Quit 메세지를 수신하는 순간 GetMessage 함수가 FALSE를 반환함으로서 메세지 루프가 종료된다.
        */
        PostQuitMessage(0);
        return 0;
    }

    // 윈도우 프로시저에서 처리되지 않은 나머지 메세지를 처리해준다.
    return (DefWindowProc(hWnd, iMessage, wParam, lParam));
profile
개발자가 되기 위해 조금씩 나아가겠습니다.

0개의 댓글