GWL_USERDATA用于存储对象指针的替代方法是什么?

在我工作的Windows应用程序中,我们有一个直接位于Win32上方的定制框架(不要问)。 当我们创build一个窗口的时候,我们通常的做法是通过SetWindowLong(hwnd, GWL_USERDATA, this)this放在窗口的用户数据区域,这使得我们可以有一个类似MFC的callback或紧密集成的WndProc 。 问题是,这不能在Win64上工作,因为LONG只有32位宽。 这个问题的更好的解决scheme是什么,适用于32位和64位系统?

Solutions Collecting From Web of "GWL_USERDATA用于存储对象指针的替代方法是什么?"

在这些实例中创建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,更多的信息,请参阅