"this"指针会改变吗?



我正在使用Win32 API,以及一些包装本机Win32 API函数的C++类,并管理窗口和应用程序本身。

因此,我还需要窗口过程(WndProc())来获取和处理一些消息。

为了处理这些消息,我使用类实例指针访问类的一些成员函数:

Window* this_window = (Window*)GetWindowLongPtr(hWnd, GWLP_USERDATA);

但这里我有一个问题,可能不是问题,但我不确定C++标准是如何定义这种情况的。我使用CREATESTRUCT结构将this指针保存在创建窗口的成员函数中。最后一个参数保存this指针:

CreateWindowExW(dwExStyle, lpClassName, lpWindowName, dwStyle, x, y, width, height, hWndParent, hMenu, hInstance, this);

对于此方法,this指针不得更改。如果是这样,我将使用WndProc()函数中的无效指针。

我可以相信this指针不会改变吗?

指针不会改变,但您必须确保它一开始就指向正确的东西。

CreateWindowEx()lpParam参数是void*,因此它将按原样接受任何指针。但是,您的WndProc()需要一个Window*指针,因此请确保您首先存储的是Window*指针。

例如,如果在从Window派生的类MyWindow中调用CreateWindowEx(),则this将是MyWindow*而不是Window*。根据MyWindow的实际实现方式,指向相同MyWindow对象Window*指针和MyWindow*指针不能保证指向相同的内存地址。因此,在将this传递给SetWindowLongPtr(GWLP_USERDATA)之前,您应该将其从MyWindow*向上转换为Window*,例如:

CreateWindowExW(..., static_cast<Window*>(this));

或者:

CreateWindowExW(..., this);
...
Window* this_window = static_cast<MyWindow*>(pcs->lpCreateParams);
SetWindowLongPtr(..., reinterpret_cast<LONG_PTR>(this_window));
...

相关内容

  • 没有找到相关文章

最新更新