본문 바로가기
컴퓨터/C, C++

[C/C++] HANDLE 자료형에 대한 캐스팅 연산

by stdFrog 2022. 10. 28.

 가끔 실습을 하다 보면 여러 가지 문제로 프로그램이 실행되지 않거나 컴파일되지 않는 상황이 발생합니다.

또는, 올바르지 않은 캐스팅 연산으로 데이터가 읽히지 않는 경우도 있죠.

 

 작성자와 같이 독학하는 경우 이런 문제에 대한 해결 방법을 찾으려면 시간이 꽤나 소요됩니다.

해서 공부하면서 막혔던 부분을 몇 가지 기록해두려 합니다.

 

일단, 제목에 나온 HANDLE 타입이 무엇인지 먼저 보겠습니다.

typedef PVOID HANDLE;
typedef void *PVOID;

 

 HANDLE 자료형은 위에 나와있듯 그냥 void*형과 같습니다.

 

다음은 이 HANDLE 자료형을 리턴하는 함수에 대해 알아보겠습니다.

HANDLE GetPropW(
  [in] HWND    hWnd,
  [in] LPCWSTR lpString
);

 

 위에 나와있는 GetProp 함수는 여분 메모리를 생성하고 이를 사용할 때 쓰입니다. 이에 대한 자세한 설명은 넘어가겠습니다.

 

 문제는 위 함수를 64비트에서 사용할 때 나타납니다.

기존의 32비트에선 GetProp 함수를 다음과 같이 사용했습니다.

int Data;

SetProp(Wnd, TEXT("Percent"), (HANDLE)Data);

...

Data = (int)GetProp(Wnd, TEXT("Percent"));

Data += 16;

...

RemoveProp(Wnd, TEXT("Percent"));

 

 32비트 운영체제에선 정수형 변수를 만들고 GetProp의 반환 값을 int형으로 캐스팅하여 활용했는데, 현재의 64비트 체제에선 위와 같이 접근하면 컴파일러가 경고 문구를 출력하며 컴파일되지 않습니다.

 

 이는 윈도우의 길이, 그러니까 함수가 기억하는 값의 길이가 변경되어 int형과 호환되지 않는 것으로 보입니다.

 

현재는 다음과 같이 작성해야 됩니다.

INT_PTR Data;

SetProp(Wnd, TEXT("Percent"), (HANDLE)Data);

...

Data = (INT_PTR)GetProp(Wnd, TEXT("Percent"));

Data += 16;

...

RemoveProp(Wnd, TEXT("Percent"));


INT_PTR은 다음과 같습니다.

#if defined(_WIN64) 
 typedef __int64 INT_PTR; 
#else 
 typedef int INT_PTR;
#endif

 

 정확하진 않으나 64비트로 넘어오면서 주소 체계(메모리)가 변하다 보니 HANDLE 자료형에도 적용된 것 같습니다. 물론 더 연구를 해봐야 알겠지만 PTR 자료형을 사용하는 게 호환성면에서 유리하다는 건 확실히 기억해둬야겠습니다.

 

글은 짧게 끝내겠습니다.

감사합니다.

반응형

댓글