2008-09-18 2 views
7

어떻게 HWND (C++ Visual Studio 8)로 길게 캐스트 할 수 있습니까?long to HWND (VS8 C++)

C4312 경고 : '형식 캐스트'

Long lWindowHandler; 
HWND oHwnd = (HWND)lWindowHandler; 

는하지만 다음과 같은 경고를 가지고 변환을 'LONG'에서 큰 크기의 'HWND'

감사합니다.

HWND hWnd = (HWND)(LONG_PTR)lParam; 

답변

8

HWND는 윈도우의 핸들이다 : 당신은 당신이 가지고이 정말 HWND 것을 확신있는 한

9

는, 다음은 간단합니다. 다음과 같이 이 유형은 WinDef.h에 선언 :

가 HWND 핸들 typedef에;

핸들은 개체에 대한 핸들입니다. 이 형식은 WinNT.h에서 다음과 같이 선언됩니다.

typedef PVOID HANDLE;

마지막으로 PVOID는 모든 유형의 포인터입니다. 이 형식은 WinNT.h에서 다음과 같이 선언됩니다.

typedef void * PVOID;

따라서 HWND는 실제로 void에 대한 포인터입니다. 다음과 같이 길게 HWND에 캐스트 할 수 있습니다.

HWND h = (HWND) my_long_var;

그러나 어떤 정보가 my_long_var에 저장되는지 매우 신중해야합니다. 거기에 포인터가 있는지 확인해야합니다.

나중에 편집 : 이 경고는 64 비트 이식성 검사를 사용하도록 설정했음을 나타냅니다. 32 비트 응용 프로그램을 빌드하는 경우 무시할 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 나는 그것을 시도하고 경고 : 경고 C4312 : '형식 캐스트': 더 큰 크기의 '오랫동안'에서 'HWND'로 변환 어떤 제안? 감사합니다. . –

+1

이것이 최고의 대답이라고 생각합니다.'(HWND) long_ver'이 저에게 효과가 없습니다! – ehsun7b

5

이렇게하는 것은 64 비트 버전의 Windows에서 실행하지 않는 경우에만 안전합니다. LONG 타입은 32 비트이지만 HANDLE 타입은 아마도 64 비트입니다. 64 비트 코드를 깨끗하게 만들 필요가 있습니다. 즉, LONG을 LONG_PTR로 변경해야합니다.

Rules for using pointer types

:

긴 int로 포인터, ULONG, 또는 DWORD를 캐스팅하지 마십시오. 일부 비트를 테스트하기 위해 포인터를 캐스팅해야하거나 비트를 지우거나 그렇지 않으면 내용을 조작하려면 UINT_PTR 또는 INT_PTR 유형을 사용하십시오.이러한 유형은 유형으로, 포인터의 크기는 32 비트 및 64 비트 모두 Windows (예 : ULONG은 32 비트의 경우 Windows의 경우, _int64는 64 비트의 경우 Windows의 경우)입니다. 예를 들어, 다음 코드를 이식하는 이라고 가정합니다.

ImageBase = (PVOID) ((ULONG) ImageBase | ); 다음과 같이 포팅 과정의 일환으로

, 당신은 코드를 변경합니다 :

ImageBase와 = (PVOID) ((ULONG_PTR) ImageBase와 | 1);

사용 UINT_PTR 및 INT_PTR 적절한 (당신이 모르는 경우 가 필요한지 여부, 단지의 경우 그 사용에 아무런 해가 없다). ULONG, LONG, INT, UINT 또는 DWORD 형식으로 포인터를 변환하지 마십시오. HANDLE

참고 때문에 테스트하는 ULONG 값 핸들 값 를 타입 캐스팅하는 공극 *로서 정의 설정하거나 명확 하위 2 비트는 64 비트 윈도우에서 에러 이다.

+1

조언에 대한 조언이 올바른 반면 [핸들 길이에 대한이 대답] (http://stackoverflow.com/a/29526711/2636001) 또는 [해당 MSDN 기사] (https://msdn.microsoft.com)를 참조하십시오. /en-us/library/windows/desktop/aa384203%28v=vs.85%29.aspx))-'HWND'는 가장 낮은 32 비트만을 사용하므로 프로세스 경계를 ​​넘어서도 안전합니다. – dst