Winapi 在window类的额外窗口内存中存储指针的示例

Winapi 在window类的额外窗口内存中存储指针的示例,winapi,Winapi,我有一个表示文本框的类,在类的构造函数中我调用CreateWindow函数,我想在额外的窗口内存中存储指向该对象的指针,因此在WndProc函数中我将获得指针,并使用类成员。 我试着用这段代码做到这一点,但它不起作用,有人可以写一个例子如何做到这一点: 在WNDCLASSEX结构的cbWndExtra成员中,我应该给出什么值 如何调用SetWindowLong 如何调用GetWindowLong 我写的代码是: wcex.cbWndExtra = 4; 我在文本框类的构造函数中写了

我有一个表示文本框的类,在类的构造函数中我调用
CreateWindow
函数,我想在额外的窗口内存中存储指向该对象的指针,因此在
WndProc
函数中我将获得指针,并使用类成员。
我试着用这段代码做到这一点,但它不起作用,有人可以写一个例子如何做到这一点:

  • WNDCLASSEX
    结构的
    cbWndExtra
    成员中,我应该给出什么值
  • 如何调用
    SetWindowLong
  • 如何调用
    GetWindowLong
我写的代码是:

  wcex.cbWndExtra   = 4;
我在文本框类的构造函数中写了这个:

  hWnd = CreateWindow(...);
  SetWindowLong(hWnd,0,(LONG)this);
WndProc
函数中

  unique_ptr<TextBox> pTextBox;
  pTextBox.reset((TextBox*)GetWindowLong(hWnd,0));

它也可以工作,但是使用
unique\ptr
它不工作。

来自MSDN文档中关于“SetWindowLong”的“Index”参数

要设置的值的从零开始的偏移量。有效值的范围为0到额外窗口内存的字节数减去整数的大小。要设置任何其他值,请指定以下值之一

正偏移量可以指向任何字节偏移量,只要您在WNDCLASS结构中创建的窗口中至少包含该数量的“cbWndExtra”

我怀疑本例中的问题可能与指针的大小有关。您显式地将4个额外字节分配给窗口结构的末尾,但如果您在64位系统上,指针大小将为8。这可以解释它有时有效,有时无效。(如果高阶字恰好全为零,则即使地址被截断,它也可以工作。) 如果是这种情况,则需要在两个单独的调用中设置高位和低位字,或者最好使用64位变量“SetWindowLongPtr”

下面是一个简单的示例,它使用此功能在windows额外数据区域中存储两个指针(请注意,以下内容适用于32位和64位)

然后,使用以下设置值:

SetWindowLongPtr(hwnd, 0, (LONG_PTR)firstPtr);
SetWindowLongPtr(hwnd, sizeof(char*), (LONG_PTR)secondPtr); // Index is byte offset.
LONG_PTR firstPtr = GetWindowLongPtr(hwnd, 0);
LONG_PTR secondPtr = GetWindowLongPtr(hwnd, sizeof(char*));
并使用以下命令检索值:

SetWindowLongPtr(hwnd, 0, (LONG_PTR)firstPtr);
SetWindowLongPtr(hwnd, sizeof(char*), (LONG_PTR)secondPtr); // Index is byte offset.
LONG_PTR firstPtr = GetWindowLongPtr(hwnd, 0);
LONG_PTR secondPtr = GetWindowLongPtr(hwnd, sizeof(char*));

但是,如果只需要存储一个指针,则可以不设置任何额外内存,将cbWndExtra保留为零,并将GWLP_USERDATA作为索引传递。与其他预定义值一样,GWLP_USERDATA是类/窗口数据的负“向后”偏移量。它是用于此类目的的保留空间,但只能容纳一个指针值的数据。

什么是“它不工作”意思?请注意,SetWindowLong只存储一个长指针,而不是一个指针。在64位平台上,这些是不同的。@Robert-我没有得到这个类的对象,jast new object。除了@Billy ONeal关于不在64位平台上工作的观点,我看不出你的代码有任何明显的错误。你能添加类注册调用和完整的CreateWindow()吗?@HerrJoebob-请参阅我的问题编辑。