注册窗口类时,您可以设置一个参数,该参数cbWndExtra
将显示为每个窗口分配多少额外内存
cbWndExtra
类型:整数
在窗口实例之后分配的额外字节数。系统将字节初始化为零。如果应用程序使用 WNDCLASS 在资源文件中注册使用 CLASS 指令创建的对话框,则必须将此成员设置为 DLGWINDOWEXTRA。
在最后一段中,它说要访问此内存,您需要使用SetWindowLong
SetWindowLong 函数将一个值复制到额外的内存中。GetWindowLong 函数从额外内存中检索一个值。WNDCLASSEX 结构的 cbWndExtra 成员指定要分配的额外窗口内存量。不使用内存的应用程序必须将 cbWndExtra 初始化为零。
但是从描述 SetWindowLong
本身来看,我不明白如何获得这段记忆。我所看到的只是内存已分配事实的声明
通过在与 RegisterClassEx 函数一起使用的 WNDCLASSEX 结构的 cbWndExtra 成员中指定一个非零值来保留额外的窗口内存。
那么如何获得指向该内存的指针呢?如果我理解正确,那么 GWL_USERDATA 在大小上是一块单独的内存,sizeof(LONG_PTR)
它不依赖于cbWndExtra
这可以通过调用来完成
GetWindowLongPtrW
- 此函数将第二个参数作为为窗口分配的附加内存块中的偏移量,或常量之一(值小于零)。因此,在第一种情况下,返回值将是从该附加内存复制的 <pointer size> 字节。好吧SetWindowLongPtrW
,他是这样写的。您无法获得指向此内存的指针。