WinAPI 기본 (1)

CJB_ny·2022년 8월 19일
0

WinAPI

목록 보기
1/79
post-thumbnail

선 설명

지금 Window에서 실행될 프로그램을 만드는 것이다.

내가 만든 프로세스 (다른말로 프로그램)이 "실행" 된다는 것은

당연히 OS (Window 운영체제) 안에서 실행이 되는 것이다.

컴퓨터가 켜저서 가장먼저 "메모리"를 점유하는 것은

"운영체제 프로그램"이다.

제일먼저 실행되는 프로그램이 "OS"

그 위에 얹혀저서 실행될 프로그램을 만드는 것이다.

이거 뭐임?

그냥 말 그대로 안쓴다는 말.

매크로임. (전처리 #define)

컴파일러가 무시함.

SAL (주석언어)

main함수 인자로 변수를 받는데 앞에 In 뭐 보라색으로 이상한거 붙어있는데

이거는 변수의 의미를 적어 놓은 것이다.

SAL이라는 것으로 의미를 함축 해놓은 것이다.

막 이런식으로 주석으로 설명 길게 달아놓으면 가독성 안좋아짐.

어느정도 약속된 키워드를 달아놓는 것이다.

wWinMain인자 살펴보기

실행된 프로세스의 시작 주소

In HINSTANCE hInstance의 HINSTANCE타입으로 들어오는 hInstance는

프로세스(프로그램)가 시작되는 "메모리 주소"이다.

그러니까 지금 이 솔루션 실행하면

여기서 프로그램이 메모리에 올라가게되는데

어느부분은 힙영역이니, 어니 부분은 스택, 어느부분은 데이터이니 ro영역이니 코드영역이니 하면서 컴퓨터 메모리에 올라가는데

이렇게 올라갈때 할당받은 메모리 영역이 있는데

거기의 시작주소를 의미를 하는 것이다.

hPrevInstance

"prev" 이전?

예를들어

그림판 한개 실행하고 하나 더 실행했는데

처음 실행한게 hprevInstance에 들어갈 것이다.

근데 이게 반은 맞고 반은 틀림.

초창기의 윈도우가 그랬다.

지금은?

근데 지금은 이렇게 동작을 하지 않는다.

지금은 hPrevInstance의 값이 다같은 값이 나온다.

hInstance가 프로세스 시작 주소라매?

어폐가 있는데??

가상 메모리 시스템 (VMS?)

윈도우가 "가상 메모리 시스템"을 사용하기 때문에 다 같은 값이 나온단다.

분명히 프로그램을 여러개를 실행시켰지만

사용자로 하여금 윈도우는 "각 프로그램 마다" "고유한 영역"이 있다고 생각을 하게 만든다.

각 프로세스 별로 "0번지"는 다 다른 것이다.

무인도

각자 자신의 무인도에 중심점을 찍었는데

절대적인 관점에서는 위치가 다름.

가상메모리가 이런상황이다.

그래서 hInstance는 프로세스의 가상 시작 주소이다.

따라서 프로세스의 실제 시작 주소를 알 수 없다.

윈도우 운영체제 안에서 실행되는 경우에는...

lpCmdLine

프로그램 시작할 때 문자열같은 것을 넣어 줄 수 있다.

프로그램을 실행파일로 실행하지말고

윈도우 명령어로 명령 프롬프트로 프로그램 실행할 때

추가적인 문자열을 넣어주면 lpCmdLine으로 받아올 수 있다.

드라이버 확인하는 명령어 인데 '-e'로 추가적으로 붙여줌.

이게 뭔지에 따라서 분기처리해서 실행함.

(지금은 게임 프로그래밍이라 사용은 안할 것이고 이런게 있다는 거 정도 숙지)

리소스 뷰

리소스 = '자원'

해당 프로젝트를 사용하면서 사용할 자원 목록들이 들어있는 것이다.

우리 프로젝트에서 끌어다 사용할 자원이다.

Client, CLIENT 이 문자열 자체가 자원이다.

우리 프로젝트 기본 설정이 내가 이름지어준 문자열을 등록을 해놓은 것이다.

거기에 ID값을 준것이다.

그러면 윈도우에서 제공하는 LoadStringW이게 메모리에 올려주는데

이거 왜하냐?

아무것도 안 만진 상태에서 실행하면

이런 창이 뜨는데

이 화면은 타이틀 창 이름을 아직 지어주지 않았으니까

프로젝트 만들 때에 프로젝트 이름을 지어주었잖아.

그 초기 타이틀 창 이름을

너가 지어준 프로젝트 이름으로 열겠다. 이말이다.

szTitle 이라는 것이.

이렇게 내가 원하는 문자열을 w_chart 타입으로도 넣어 줄 수 있다.

MyRegister

얘는 지금 프로그램 시작주소인 hInstance를 인자로 받아주고있다.

정의부분에 보면 WNDCLASSEXW 이거 구조체임

여기 구조체 멤버를 채우는 부분이다.

MyRegisterClass는 여기 구현되어있지만

마지막에 RegisterCalssExW는 윈도우에서 제공해주는 함수이다.

그래서 선언만 볼 수 있고 실제 구현부는 볼 수 없다.

윈도우는 '인터페이스' 역할을 한다.

착각하면 안됨.

프로세스(프로그램) != '윈도우'

내가 프로그램 하나 실행시키면 os가

이렇게 실행시켜준다.

그런데 그 같은 프로그램을 여러개를 실행 시킬 수 있는 것이고...

특정 프로세스는 '윈도우'를 가질 수도있고 안 가질 수도있다.

여기서 이제 윈도우의 X버튼을 눌렀을때를 확인해서

누른경우를 그냥 프로그램 종료라고 받아들이게끔 맞물려 있을 뿐이다.

profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글