c++ - 프로그래밍 - windows programming




MAKEINTRESOURCE()가 작동하는 이유는 무엇입니까? (2)

매크로는 다음과 같이 정의됩니다.

#define MAKEINTRESOURCEA(i) ((LPSTR)((ULONG_PTR)((WORD)(i))))
#define MAKEINTRESOURCEW(i) ((LPWSTR)((ULONG_PTR)((WORD)(i))))

리소스 ID (16 비트 부호없는 int) 또는 그 이름 (char 배열에 대한 포인터)을 나타내는 데 어떻게 사용할 수 있습니까? 이것은 효과적으로 (32 비트 시스템에서) 16 비트 주소 공간을 제한하지 않습니까? 그렇지 않으면 ID 또는 이름 중 어느 것을 사용하고 있는지 시스템이 어떻게 알 수 있습니까?


MAKEINTRESOURCE 매크로는 숫자 매개 변수와 문자열 포인터 사이에서 형변환을 수행합니다. 결과 문자열 포인터가 유효하지 않으며 리소스 이름으로 역 참조 할 수 없습니다. 그러나 자원 처리 API는 이러한 포인터를 절대 값으로 감지하여 자원 이름이 아닌 자원 ID로 취급합니다. C 스타일 API는 오버로드를 지원하지 않으므로 다음과 같은 두 가지 함수를 정의 할 수 없습니다.

HICON LoadIcon(HINSTANCE hInstance,LPCTSTR lpIconName);
HICON LoadIcon(HINSTANCE hInstance,UINT resourceId);

따라서 API 개발자는 두 경우 모두 동일한 기능을 사용하기로 결정하여 API 사용자를 위해 MAKEINTRESOURCE 매크로를 제공했습니다. 나는 두 가지 기능이 더 잘 어울릴 것이라고 생각한다.

HICON LoadIconByName(HINSTANCE hInstance,LPCTSTR lpIconName);
HICON LoadIconById(HINSTANCE hInstance,UINT resourceId);

그러나 이것은 Windows API가 구현되는 방식이 아닙니다. 유효한 자원 ID는 항상 가능한 최소 포인터 값보다 작습니다. 리소스 이름 매개 변수는이 매크로없이 API에 전달되며 값은 제한되지 않습니다.


예, 주소 공간을 제한하지만 생각만큼 많이하지는 않습니다. 그들은 효과적으로 4GB 주소 공간의 64KB를 조각 냈습니다. 64KB의 전부는 아니더라도 대부분은 Windows에서 이미 다른 것으로 예약되어 있으므로 실효 손실은 없습니다.

포인터와 정수 ID를 구별하기 위해 추가 정보가 필요 없기 때문에 전반적으로 공간을 절약 할 수 있습니다. 이것은 공간이 프리미엄이되었을 때 나쁜 옛날에 발명되었습니다.





winapi