문제

x64 대상 빌드의 'Ole_handle'에서 'Hicon'으로 캐스트하는 올바른 방법은 무엇입니까?

특히 일반적인 C 스타일 캐스트를 사용하면 X64 구성으로 컴파일 할 때 경고를받습니다.

경고 c4312 : '타입 캐스트': 더 큰 크기의 'ole_handle'에서 'hicon'으로 변환

불쾌한 코드는 다음과 같습니다.

imgList.Add((HICON)ohIcon);

위의 코드는 나에게 잘 작동하지만 x64를 구축 할 때 경고를 제거하고 싶습니다.

도움이 되었습니까?

해결책

H는이를 제공합니다.이 경우 라이브러리 코드는 오래된 C API 시대에 약간의 유형 안전을 제공하기 위해 고유 한 유형을 만들었습니다.

그것들은 실제로 둘 다 핸들입니다. 이것은 자원이 무엇인지 실제로 신경 쓰지 않는 커널 객체입니다. API는 C ONE이므로 C 스타일 캐스트를 사용하고 삭제할 때 DeleteObject ()를 사용하십시오.

편집 : 64 비트 eh ... 문제는 MS가 핸들을 64 비트로 업데이트했지만 올레 물건을 혼자 남겨두기 때문입니다. 다행히도, 그들이 한 모든 일은 0을 제로로 채우는 것이 었습니다.

사용해보십시오 LongtoHandle 변환 루틴 그리고 미드 포팅 가이드 - "사용자 및 GDI 핸들은 32B 값 부호"섹션으로 반쯤 스크롤합니다.

다른 팁

질문에 따라 Microsoft Visual Studio를 사용하고 있다고 가정합니다 ...

32 비트 대상에 대해서만 개발중인 경우 프로젝트 옵션을 끄면이 (및 기타 유사한 경고)를 비활성화하도록 선택할 수 있습니다. "64 비트 휴대 성 문제 감지"(C ++ 컴파일러 옵션 /WP64).

64 비트 대상을 개발하는 경우 @Harper가 옳을 것입니다.이를 처리하기 위해 올바른 방법을 더 파는 것이 필요합니다. 읽고 싶을 수도 있습니다 이 백서 출발점으로; 사용자 및 GDI 핸들에 대한 섹션으로 이동하십시오.

나는 약간의 파기를했다 - Ole_handle은 서명되지 않은 길이로 보이고, Hicon은 무효입니다*. 32 비트 창에서는 크기가 같지만 Windows X64에서는 무효가 64 비트입니다. 이 캐스트를 만드는 안전한 방법은 없습니다. 추가 32 비트는 정의되지 않습니다. 불행히도, Ulongs와 관련하여 파헤칠 수있는 유일한 조언 (Ole_handles는 심지어 짐승이 더 드물다)은 단순히 "포인터로 캐스팅하지 마십시오"라고 말했습니다.

나는 그들 사이에 "올바른"방법에 대한 "올바른"대답이 "하지 말아라"라고 생각합니다. 틀림없이 그것은 그다지 도움이되지 않습니다 ... 처음에 Ole_handle이 어디에서 왔습니까? Ole_handle을 사용하여 코드를 다시 작성하여 모든 곳에서 히콘을 사용해야하는 것 같습니다.

HICON hSomeIcon = (HICON) hSomeOLEHandle;

즉, 교환 가능합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top