在我工作的Windows应用程序中,我们有一个直接位于Win32上方的定制框架(不要问)。 当我们创build一个窗口的时候,我们通常的做法是通过SetWindowLong(hwnd, GWL_USERDATA, this)
把this
放在窗口的用户数据区域,这使得我们可以有一个类似MFC的callback或紧密集成的WndProc
。 问题是,这不能在Win64上工作,因为LONG只有32位宽。 这个问题的更好的解决scheme是什么,适用于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风格thunking,更多的信息,请参阅