Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

승쨩개발공부

[API] Win32 API ?(함수호출규약) 본문

WIn32 API

[API] Win32 API ?(함수호출규약)

Unknowns 2021. 11. 8. 15:14

API란?

Application Program Interface 의 약자.

응용프로그램을 프로그래밍 하기 위한 함수들의 집합체 이다.

 

WinAPi = 윈도우용 API, 윈도우에서 제공되는 함수로 윈도우 창을 직접 만들어서 사용한다.

 

 

 

윈도우의 특징

그래픽(GUI) 기반 운영체제

멀티테스킹이 가능하다   ex: 게임하면서 음악듣기

겟메시지의 블럭방식 덕에 가능하다

메세지 구동 시스템 -> 메시지를 받아와서 처리하는 형태

장치들이 독립적이다 -> 디바이스 드라이버에 의해 그래픽카드 등 외부 하드웨어 들을 관리한다  ex:GrapicDriver(NVIDIA)

 

 

 

CallBack함수?

메시지를 받아서 처리하는 함수

 

wWinMain이 C++ Main이다 (Win32의 진입점 함수)

 

 

 

 

함수 호출 규약?

함수 호출 규약 이란, 함수를 호출하는 방식에 대한 약속이다. 함수 호출 규약은 인자 전달 방법, 인자 전달 순서, Stack Frame을 정리하는 방법에 따라 그 종류를 구분한다.

 

_stdcall   _cdecl

 

(1) _cdecl 방식 (C declaration)

1. C와 C++(가변인자)의 기본 호출규약이다.

2. 인자(argument)는 스택을 사용해서 오른쪽에서 왼쪽 순서로 전달한다.

3. callee(호출자)가 스택포인터를 정리한다. (c언어에서는 내부적으로, (어셈블리)assembly에서는 직접)

4. 함수이름 앞에 _(언더바) 기호가 붙는다.

 

(2) _stdcall 방식 (Standard Call)

1. Win32 API[Windows OS의 System Call]의 기본 호출 규약이다.

2. _cdecl 방식과 동일하게 인자(argument)는 스택을 사용해서 오른쪽에서 왼쪽 순서로 전달한다.

3. caller(피호출자)가 스택포인터를 정리(복원)한다.

4. 함수이름 앞에 _(언더바) 기호, 함수이름 끝에 @ 기호가 붙는다.

5. 장점 : 함수의 독립성이 좋다, _cdecl방식보다 코드 양이 적다.

(여러 곳에서 호출되더라도 스택정리 코드는 함수 내 1번만 존재)

 

 

 

 

Handle?

 

운영체제가 무언가를 식별하기 위한 키값을 핸들 이라고 한다
이 키값으로 해당 핸들의 정보를 찾음
- Handle 은 보통 32bit 정수형 값을 가지고 있다 (정수형이 비교가 제일 빠름)
핸들 번호는 운영체제가 정함
핸들은 절대 중복되는 정보를 가지지 않는다(식별을 위해 같은 정보를 가지지 않음)

 


Instance
실제로 사용할수 있는 객채를 만들어 내는것을 Instance 라고 한다

 


HInstance
핸들 인스턴스, 프로그램의 인스턴스 식별자, 쉽게보면 프로그램 자체의 실제화된 주소
(프로그램 마다 하나씩 들어감)  우리가 건드리는 영역이 아님 운영체제님이 노하심

 


HDC
= Handle Device Contest 의 약자.
Device Contest 란?
출력에 필요한 정보를 가지는 데이터 구조체, 좌표,색,굵기 등 출력에 필요한 모든 정보를 담고있다
결국 HDC란 DC의 정보를 저장하는 데이터 구조체의 위치를 알기위함
HDC는 포인터가 아니다. 항상 실제 객체에 메모리 주소를 가르킬 뿐이다
->물리적으로 메모리 주소가 바뀌어도 DC에 실제 위치를 찾아감

 


LoadString
윈도우창: 윈도우 제목,   최소화,최대화,종료 버튼 이 있는 창을 타이틀바라고함
타이틀바에는 윈도우 창에 제목을 문자열로 지정할수있음
내부적으로 StringTable 로 재목을 넣음
LoatString이 StringTable 에 있는걸 읽어오는 방식
StringTable에도 Map과 같이 Key 와 value가 있음 Key는 ID값 value 는 실제값
어떤 특정 ID값을 이용해서 찾아내는것이 StringTable 임

 


클라이언트 영역
타이틀바를 재외한 영역 우리가 실질적으로 출력을하는 창

 


MyRegisterClass
WNDCLASSEXW : 정의되어있는 구조체다

 


wcex.style = CS_HREDRAW | CS_VREDRAW
REDRAW : 다시그린다 윈도우 창에 변화가 생길경우 크기를 늘리거나 줄인다
lpfnWndProc
윈도우즈는 메시지 기반 운영체제다
마우스나 키보드를 눌렀을떄 이벤트 라고 한다 (화면보호기 등)
메시지 큐에 어떤 기능이 들어있는지 정확히 알아야한다 그런 기능을 하는게 메시지 프로시져이다
윈도우 프로시져라고 불름

 

 


메시지큐
어떤 이벤트냐 에 따라서 메세지로 만들어준다 그 후에 만들어진 메세지를 메세지큐(자료구조 큐)
선입선출이다 (먼저들어온 놈이 먼저나감) LIFO와 다름
ex: 스페이스바와 왼쪽마우스를 동시에누름 왼쪽클릭이 먼저되면 안됨 그렇기에 큐로 구성함
이벤트가 발생한 순서대로 넣어놓으면 그 순서대로 차례대로 꺼내면서 순서대로 처리함

 

 


메시지 루프
프로그램을 종료해야되면 종료메세지를 발생시켜줌 그런 메세지 큐에 메시지가 들어가있는지를 실시간으로
무한루프를 돌면서 메세지가 들어있는지 감시해야됨 그런 루프를 보고 메시지 루프라고함

 

 


IConSm
스몰 아이콘 타이틀 바에있는 아이콘을 IConSm 이라고 함
ICon은 일반 아이콘

 

 


Cursor
커서는 마우스 모양을 의미함

 


Background
배경화면 컬러를 바꿀수있음

 


MenuName
매뉴 이름 (파일(f)) 같은것 우리는 안쓸꺼임 NULL로 지정해줘야함 매뉴창까지 좌표에 간섭함

 


ClassName
레지스터에 등록할 클래스이름

 


Initlnstance
이 함수에서 실제 입력화면에 보여줄 실제 윈도우창을 출력을하는대 CreateWindowW를 이용해서 윈도우 창을 만듬

 


WS_OVERLAPPEDWINDOW
윈도우창에 스킨? 같은 개념 최소화 최대화 종료 창이나 프레임창이나 이런걸 다른 그림으로 바꿀수있음

 


윈도우 좌표계
X : 좌,우 Y : 위,아래
X가 증가할수록 오른쪽 감소할수록 왼쪽
Y가 증가할수록 아래쪽 감소할수록 위쪽
0,0 : 클라이언트 영역 왼쪽 최상단

 


IF(!hWnd)
{
return FALSE; (return 0;)
}
이뜻은 윈도우 핸들이 출력이 안되었다는뜻(윈도우 창이 생성이 안됨)
예외처리를 여기서 함

 


ShowWindow
윈도우 창이 생성이 됬다 (보여준다)

 


UpDateWindows
이 윈도우창 업데이트 시작하자!

 


MSG
윈도우 메세지 구조체

 


GetMessage
메세지를 가져온다
예를들어서 메세지가 비어있는경우에는 메세지가 발생하지 않는다 이런 경우에는 윈도우의 데드타임이라고한다 (윈도우가 죽어있는 시간)
메세지가 발생하지 않는한은 GetMessage를 빠져나오지 않는다(뭐라도 해야 빠져나간다)

 


Peek
Message
PeekMessage는 메시지가 메세지큐에 없어도 바로 빠져 나온다
메세지가 있을경우 true, 없을경우 false가 된다 메세지가 없는 시간이 윈도우의 데드타임이다


버추얼 키
문자나 숫자를 재외한 키값 (스패이스 컨트롤 알트 F1등)

 


WM_PAINT
화면의 갱신해야 할경우 무언가를 그릴떄 문자열을 출력할떄 여기 들어온다

 


WM_DESTROY
윈도우가 종료될떄 호출되는 메세지
(PostQuitMessage) 메세지를 나간다 = 윈도우 창을 종료한다

 

 


LRESULT CALLBACK WndProc(HWND,UNIT Imessage, WPARAM,LPARAM)
콜백함수, 윈도우 프로그램은 메시지를 받으면 콜백 함수로 보낸 후 그에 따른 처리를 한다
매개변수를 정리하자면
윈도우 핸들, Unsigned Int 메세지, 메세지 정보1, 메세지 정보2
보통 정보 1은 키보드, 정보 2로는 마우스가 들어옴
Imessage는 정수형 자료이므로 스위치문의 정보로 쓰인다.

 

 


WM_형식은 윈도우 메시지 방식을 말한다.
즉 WM_KEYDOWN은 키를 눌렀을떄 이 스위치문으로 들어온다.

 

 


유용한 WM_메시지
WM_CREATE : 윈도우가 최초로 생성될떄
WM_MOUSMOVE : 마우스가 이동할떄
WM_LBUTTONDOWN : 마우스 좌클릭
WM_LBUTTONUP : 마우스 클릭후 떌떄
WM_LBUTTONDBLCLK : 마우스 좌 더블클릭
WM_CLOSE : 윈도우 종료 명령이 들어올떄
WM_KEYDOWN : 키보드 누룰떄

 


ex: exc를 누르면 윈도우창이 종료되게
case WM_KEYDOWN:
switch (wParam)
{
case VK_ESCAPE:
      DestroyWindow(hWnd);
}

 

 


문자열 출력
TextOut(hdc,x좌표,y좌표,L"문자열",문자크기);
TextOut(hdc,x좌표,y좌표,TEXT("문자열"),문자크기);

 


도형,선 그리기
사각형 : Rectangle(hdc,left값,top값,right값,bottom값);
원(타원)      : Ellipse(hdc,left값,top값,right값,bottom값);
시작점 : MoveToEx(hdc,x좌표,y좌표,LPpoint(굳이 넣어줄필요없음 NULL로처리));
끝점    : LineTo(hdc,x좌표,y좌표);
기본적으로 MoveToEx 후 LineTo를 쓰면 끝점이 시작점이된다 새로 위치를 받을떄에는 다시 새로 MoveToEx를 넣어줘여한다.

 

 


WM_LBUTTONDOWN
마우스 위치는 lParam 에 들어오게 되는데 16비트로 쪼개서 x, y 값이
32비트 변수에 들어오게 된다.
LOWORD, HIWORD 매크로를 이용해서 하위,상위 16비트의 값을 얻어올 수 있다.

 

 


wsprintf
유니코드 문자열을 만들어주는 함수이다
%d 에는 정수가 대입된다

 

 


InvalidateRect
강제로 WM_PAINT 메세지를 호출해주는 함수이다
1번 인자는 윈도우 핸들이 들어간다
2번 인자는 갱신할 영역이 들어가는데
NULL을 넣어줄 경우 전체 화면을 대상으로 갱신한다
3번 인자는 TRUE일 경우 현재 화면을 지우고 갱신
FALSE일 경우 현재 화면을 안지우고 갱신