win32의 데이터형인 핸들에 관한 질문입니다

win32 에서 HANDLE이라는 타입은

typedef void *HANDLE;

다음과 같이 void*를 typedef한 것입니다

그리고 HBRUSH라는 타입또한
image
다음과 같이 microsoft docs를 찾아보면

HANDLE을 typedef 한것으로 나와있습니다

그런데 궁금한점은 그렇다면 HBRUSH는 void*여야 하는데

WNDCLASSEX wcex;
wcex.cbSize = sizeof(wcex);
...
wcex.hbrBackground = (void*)(COLOR_WINDOW + 1); // 에러

다음과 같이 윈도우 구조체를 선언할때 그냥 void*로 캐스팅하면 캐스팅이 되지 않습니다

그래서 HBRUSH를 타고들어가보니

DECLARE_HANDLE(HBRUSH);

다음과 같이 정의가 되어있었습니다

그리고 DECLARE_HNDLE매크로를 타고들어가보면

#define DECLARE_HANDLE(name) struct name##__{int unused;}; typedef name##__ *name}

다음과 같이 되어있습니다

HBRUSH타입을

microsoft docs에서는 void*이라고 하고

visual studio의 헤더파일에서는 HBRUSH__ 타입 포인터로 되어있는데

도데체 어떤게 맞는 건가요?

헤더파일에 적힌부분이 맞는겁니다.
보아하니 구조체로 정의가 되어 그 포인터를 의미하는군요.

Msdn에 오래된 문서들이 많습니다.
저도 appcontainer 사용할때 고생좀했죠.

그렇군요 감사합니다 맞는거 찾아서 다시 공부해야 겠네요ㅠㅠ

핸들을 윈도 커널에서 볼 때는 단순히 하나의 정수값인데 아마 각 핸들 간 암묵적인 타입캐스팅을 막기 위해 이렇게 정의한 게 아닐까 싶네요…

흠 더 찾아보니 저기 쓰여잇는 color_window는 정수값이네요.

애초에 저 hbrBackground에 주소를 넣는게 아닌걸수도…

알려주셔서 감사합니다 ^^