객체 포인터를 저장하기 위한 GWL_USERDATA의 대안은 무엇입니까?
문제
제가 작업하고 있는 Windows 애플리케이션에는 Win32 바로 위에 위치하는 사용자 지정 프레임워크가 있습니다(묻지 마세요).창을 만들 때 일반적인 관행은 다음과 같습니다. this
창의 사용자 데이터 영역에서 SetWindowLong(hwnd, GWL_USERDATA, this)
, 이를 통해 MFC와 유사한 콜백 또는 긴밀하게 통합된 기능을 사용할 수 있습니다. WndProc
, 따라.문제는 LONG의 너비가 32비트에 불과하기 때문에 이것이 Win64에서는 작동하지 않는다는 것입니다.32비트 및 64비트 시스템 모두에서 작동하는 이 문제에 대한 더 나은 솔루션은 무엇입니까?
해결책
SetWindowLongPtr 교체하기 위해 만들어졌습니다 SetWindowLong 이러한 경우에는.LONG_PTR 매개변수를 사용하면 32비트 또는 64비트 컴파일에 대한 포인터를 저장할 수 있습니다.
LONG_PTR SetWindowLongPtr(
HWND hWnd,
int nIndex,
LONG_PTR dwNewLong
);
상수도 변경되었으므로 이제 사용법은 다음과 같습니다.
SetWindowLongPtr(hWnd, GWLP_USERDATA, this);
또한 이제 포인터를 검색하려면 다음을 사용해야 한다는 점을 잊지 마십시오. GetWindowLongPtr:
LONG_PTR GetWindowLongPtr(
HWND hWnd,
int nIndex
);
사용법은 다음과 같습니다(다시 상수가 변경됨).
LONG_PTR lpUserData = GetWindowLongPtr(hWnd, GWLP_USERDATA);
MyObject* pMyObject = (MyObject*)lpUserData;
다른 팁
다른 대안은 SetProp/RemoveProp입니다(이미 GWLP_USERDATA를 사용하는 창을 하위 클래스로 분류하는 경우).
또 다른 좋은 대안은 WNDPROC의 ATL 스타일 썽킹입니다. 이에 대한 자세한 내용은 다음을 참조하세요.
제휴하지 않습니다 StackOverflow