문제

HWND(C++ Visual Studio 8)로 길게 캐스팅하려면 어떻게 해야 하나요?

Long lWindowHandler;
HWND oHwnd = (HWND)lWindowHandler;

하지만 다음과 같은 경고를 받았습니다.

경고 C4312:'형변환':'LONG'에서 더 큰 크기의 'HWND'로 변환

감사해요.

도움이 되었습니까?

해결책 2

HWND는 창에 대한 핸들입니다.이 유형은 WinDef.h에서 다음과 같이 선언됩니다.

typedef HANDLE HWND;

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

typedef PVOID 핸들;

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

typedef void *PVOID;

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

HWND h = (HWND)my_long_var;

하지만 my_long_var에 어떤 정보가 저장되어 있는지 매우 주의하세요.거기에 포인터가 있는지 확인해야합니다.

나중에 편집:경고는 64비트 이식성 검사가 켜져 있음을 나타냅니다.32비트 애플리케이션을 구축하는 경우 이를 무시할 수 있습니다.

다른 팁

가지고 있는 LONG이 실제로 HWND라고 확신하는 한 다음과 같이 간단합니다.

HWND hWnd = (HWND)(LONG_PTR)lParam;

이렇게 하는 것은 64비트 버전의 Windows에서 실행되지 않는 경우에만 안전합니다.LONG 유형은 32비트이지만 HANDLE 유형은 아마도 64비트일 것입니다.코드를 64비트로 깔끔하게 만들어야 합니다.즉, LONG을 LONG_PTR로 변경하고 싶을 것입니다.

포인터 유형 사용 규칙:

int, long, ulong 또는 dword에 포인터를 캐스트하지 마십시오.포인터를 시전하여 일부 비트를 테스트하거나 설정하거나 투명한 비트를 테스트하거나 해당 내용을 조작 해야하는 경우 uint_ptr 또는 int_ptr 유형을 사용하십시오.이러한 유형은 32 비트 및 64 비트 윈도우의 포인터 크기로 스케일링하는 필수 유형입니다 (예 : 32 비트 Windows의 경우 Ulong 및 64 비트 창의 경우 _int64).예를 들어 다음 코드를 포팅한다고 가정합니다.

ImageBase = (pvoid) ((ulong) imagebase | 1);

포팅 프로세스의 일부로 다음과 같이 코드를 변경합니다.

ImageBase = (pvoid) ((ulong_ptr) imagebase | 1);

적절한 경우 uint_ptr 및 int_ptr을 사용하십시오 (그리고 필요한지 여부가 확실하지 않은 경우 경우에만 사용하는 데 아무런 해가 없습니다).ulong, long, int, uint 또는 dword 유형에 포인터를 시전하지 마십시오.

핸들은 무효*로 정의되므로 핸들 값을 Ulong 값으로 전송하여 64 비트 윈도우에서 낮은 주문 2 비트를 테스트, 설정 또는 지우는 것은 오류입니다.

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