객체 포인터를 저장하기 위한 GWL_USERDATA의 대안은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/23083

  •  09-06-2019
  •  | 
  •  

문제

제가 작업하고 있는 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 스타일 썽킹입니다. 이에 대한 자세한 내용은 다음을 참조하세요.

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