본문 바로가기

C, C++/뇌를 자극하는 윈도우즈 시스템 프로그래밍

[뇌를 자극하는 윈도우즈 시스템 프로그래밍] 3장 WIN32 vs WIN64

개요

현재는 대부분 64비트가 표준으로서 사용되지만, 이전의 레거시 프로그램도 존재하기 때문에 두 방식을 이해하고 프로그램을 만드는 것도 중요하다.

 

64비트와 32비트

32비트 컴퓨터는 한 번에 32비트 데이터, 64비트 컴퓨터는 한 번에 64비트 데이터를 처리할 수 있다.

 

32비트 운영체제는 32비트 주소체계를 사용하고, 64비트 운영체제는 64비트 주소체계를 사용한다.

한번에 처리할 수 있는 가장 넓은 주소 범위이다. (레지스터, 버스 등도 해당 범위에 맞게 설계됨)

 


LLP64 

windows는 LLP64 데이터 모델을 사용한다. LLP는 (longlong pointer)로 longlong부터 64비트(8바이트)로 표현하는 방식이다.

LP64는 long부터(UNIX가 사용하는 방식), ILP64는 int 부터 64비트로 표현한다.

 

LLP64에서는 int는 4바이트, 주소(pointer)는 8바이트로 표현하기 때문에 주소값을 int로 캐스팅해서 받는다면 값이 잘려 손실이 발생할 수 있다.

 

Windows 스타일 자료형

Windows 전용으로 개발된 프로그램을 읽거나, Windows 전용으로 개발하기 위해서 Windows 스타일 자료형을 아는 것은 중요하다.

https://learn.microsoft.com/ko-kr/windows/win32/winprog/windows-data-types

 

Windows 데이터 형식(BaseTsd.h) - Win32 apps

Windows에서 지원하는 데이터 형식은 함수 반환 값, 함수 및 메시지 매개 변수 및 구조체 멤버를 정의하는 데 사용됩니다.

learn.microsoft.com

위의 링크를 참조해서 WINDOWS 자료형을 확인할 수 있다.

 

책에서는 TCHAR(유니코드, 아스키코드 공통지원) 방식으로 예제를 작성하지만, 64비트에서 새로 정의된 자료형은 사용하지 않는다.

 

 

Polymorphic 자료형

이름처럼, 다형적인 자료형이다.

 

이전의 UNICODE가 정의되어있으면 w(wide)계열 함수, 아니면 일반함수를 사용했던 것과 비슷하게 정의되어있다. 

포인터 계열 자료형은 64비트 시스템인 경우는 8바이트, 32비트 시스템인 경우는 4바이트이기 때문에, 이러한 자료형이 유용하게 사용될 수 있다.


GetLastError 함수와 에러코드

 

Windows 시스템 함수는 오류 발생 시 NULL을 반환하기 때문에, 오류 발생 여부는 알 수 있지만, 어떤 오류가 발생했는지는 알 수 없다.

이를 알기위해 GetLastError를 사용한다.

DWORD GetLastError(void);

해당 함수를 통해 호출 스레드에서 발생한 마지막 에러코드를 얻을 수 있다.

 

시스템 함수를 호출한 뒤 GetLastError를 호출하면 

fs를 통해 에러코드를 가져오는 것을 볼 수 있다.

 

마지막 에러코드를 가져오기 때문에 오류 확인은 오류가 발생할 수 있는 코드 다음에 바로 해야 한다.

 

일부코드는 에러코드 0을 반환해 오류가 발생하지 않았음을 표현한다.

https://learn.microsoft.com/ko-kr/windows/win32/api/errhandlingapi/nf-errhandlingapi-getlasterror

 

GetLastError 함수(errhandlingapi.h) - Win32 apps

호출 스레드의 마지막 오류 코드 값을 검색합니다.

learn.microsoft.com