OS/Windows API

#0 Windows API 프로그래밍이란 무엇인가?

VallistA2014. 8. 16. 19:16

Windows API 프로그래밍이란 무엇인가?


Windows API는 윈도우즈 운영체제에서 응용 프로그램 (Application)을 만들기 위해 윈도우 운영체제의 함수들을 이용하여 프로그래밍을 하는 것을 말합니다.

즉 API는 운영체제와 직접적으로 관련이 있는 프로그래밍이라고 생각하시면 편하실 것 입니다.


윈도우 운영체제가 나오기 전, 우리는 수많은 언어를 기반으로 각 운영체제별, 자신이 쓰는 언어 기준으로 프로그래밍을 했었는데, 이런 프로그래밍은 굉장히 비효율적이고 조금만 코딩이 잘못된다고 하면 최악의 경우 실행이 되지도 않는 상황이 일어나곤 했었습니다.

또, 하드웨어에 접근을 하기 위해서는 우리가 직접 하드웨어와의 연결을 연동하고 해야했기때문에 수많이 나온 하드웨어별로 전부 구입을해서 테스트를 진행해야 했었습니다.


물론 필자는 구시대적 프로그래밍이야 어셈블리밖에는 모르기때문에, 

당시 정황을 제대로 알지 못하지만 확실한 것은 지금은 굉장히 시대적으로 좋아져서 더이상 그러할 필요가 없다는 것 입니다.


윈도우 운영체제가 확립이 되고 배포가 된후 우리는 더이상 그러할 필요가 없어졌습니다. (현재는 운영체제가 굉장히 한정적입니다만.)

과거에는 하드웨어를 기준으로 프로그래밍을 했었습니다만, 이제는 하드웨어가 운영체제를 기준으로 만들고 있다는 것 입니다.


우리는 이제 그 운영체제에서 하드웨어를 참조하는 함수만 찾아서 사용만 하면 된다는 것 입니다!


즉 운영체제에서는 업그레이드가 될때마다 함수를 바꿀수도 있겠지만, 그러한 것을 최대한으로 줄일것이고 우리는 그 혜택만 보고 발전되는 기술을 프로그래밍에 사용이 가능합니다.

그래서 지금의 우리가 하고 있는 프로그래밍을 장치 독립적 프로그래밍 이라고 합니다.


그러면 운영체제는 키보드나 마우스의 움직임을 어떻게 잡아내고 인식을 할까요?

예전의 경우, 우리는 키보드나 마우스를 인식하게 하기위해서 BIOS에 직접 진입을 통해서 연결을 해주었으나 윈도우 운영체제에서 메시지 라는 놈을 통해서 보완하였습니다.


이제 우리는 API를 메시지라는 놈을 통해서 게임을 만들어보고 여러가지 예제를 통해서 만들어 볼 것입니다.


API 의 기본 베이스


기존의 우리는 콘솔 응용 프로그램에서 자료구조 라던지 알고리즘이라던지 어떠한 목적을 가지고 코딩을 했었을 것입니다.

대다수의 사람들은 API 프로그래밍을 하는 절차가 위에 썻던 목적을 가지고 코딩을 하는데 c,c++이 끝나고 이미지를 가지고 놀아보자! 라는 생각으로 API에 접근한 사람들이 많을 것입니다..


맞다. API는 그래픽 라이브러리를 포함하고 있어서 이미지 및 동영상, 음악파일을 재생시킬 수 있습니다..

그렇다면 우리는 어떻게 사용을 할 것인가 생각을 해보기전에, 먼저 그러한 API의 많은 기능을 사용할 수 있게 만들어놓은 베이스를 알아야 합니다..


LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hlnst;
LPCTSTR lpszClass=TEXT("First");
int APIENTRY WinMain(HINSTANCE hlnstance, HINSTANCE hPrevlnstance , LPSTR lpszCmdParam,int nCmdShow)
{
     HWND hWnd;
     MSG Message;
     WNDCLASS WndClass;
     g_hlnst=hlnstance;
     WndClass.cbClsExtra=0;
     WndClass.cbWndExtra=0;
     WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
     WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
     WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
     WndClass.hInstance=hlnstance;
     WndClass.lpfnWndProc=WndProc;
     WndClass.lpszClassName=lpszClass;
     WndClass.lpszMenuName=NULL;
     WndClass.style=CS_HREDRAW | CS_VREDRAW;
     RegisterClass(&WndClass);
     hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,(HMENU)NULL,hlnstance,NULL);
     ShowWindow(hWnd,nCmdShow);
     while(GetMessage(&Message,NULL,0,0)){
          TranslateMessage(&Message);
          DispatchMessage(&Message);
     }
     return (int)Message.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM IParam)
{
     switch(iMessage)
     {
     case WM_DESTROY:
          PostQuitMessage(0);
      return 0;
     }
     return(DefWindowProc(hWnd,iMessage,wParam,IParam));
}

API 기본 소스는 다음 화 부터 알아보도록 하겠습니다.

다음 장에 계속됩니다.

댓글

  • ㄴㅇㅁㅇ2016.06.07 14:29 LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);에서 변수를 입력해야되지 않을까요?
  • BlogIcon VallistA2016.06.08 09:31 신고 안녕하세요.

    함수 선언과정에서 변수의 네이밍을 선언 안해도 사용할 곳에서 정의를 하면 사용 가능합니다 ^^
  • 원주에서2016.12.12 16:34 님 글은 API를 이해하는데 많은 도움이 되었습니다.
    그냥 MFC wizard로 프로그래밍 하다가 원리가 궁금했는데, 너무 잘 설명되어 있군요.
댓글쓰기 폼

VallistA

병특이 끝나서 게임에서 웹으로 스위칭한 프로그래머.
프로그래밍 정보등을 공유합니다.

자고 싶습니다. ㅠㅠ

페이스북    :: 링크
카카오톡    :: kingbye1
Github      :: 링크

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

VISITED

Today : 14

Total : 404,332

SNS

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