我有一个多实例对话框,其HWND和DC包含在结构向量中。在我调用CreateWindowEx()
之前,我为结构的一个新实例分配内存,并将其指针传递给WndProc(带lpParam
)。
在WndProc中我有以下代码:
HexParams Hex;
HexParams *pHex;
if (uMsg == WM_NCCREATE) {
SetWindowLongPtr(hDlg, GWLP_USERDATA, (LONG_PTR) ((CREATESTRUCT *)lParam)->lpCreateParams);
return TRUE;
} else {
LONG_PTR lpUserData = GetWindowLongPtr(hDlg, GWLP_USERDATA);
if (lpUserData) {
pHex = (HexParams *)lpUserData;
Hex = *pHex;
} else
return DefWindowProc(hDlg, uMsg, wParam, lParam);
}
然后在整个WndProc中,我一直在使用Hex.Member
来访问它的memebrs,从它们读取并写入它们(如果它是单个实例并且结构是全局的话)。因此,当我添加多实例支持时,我希望简单地解除引用指针会从该向量中给出结构memebrs。
但是,以下示例执行不同的操作:
Hex.DC = GetDC(hDlg);
pHex->DC = GetDC(hDlg);
尽管之前做过Hex = *pHex;
。 pHex->DC
写入我的vector元素,但是Hex.DC
写到某个我无法弄清楚的地方。有没有办法在代码中保留Hex.Member
用法,或者我必须将它们全部转换为pHex->Member
?
我可能“错过了指针”,但我无法在这里正确使用它们。
答案 0 :(得分:2)
Hex
是该函数中定义的变量。写Hex.DC
将在该函数调用的堆栈中引用该结构中的4个字节。
pHex
指向调用者确定的某个地方。 Hex = *pHex;
会将到达结构的内容复制到您的本地结构中。它们是不同的记忆块。
绘制堆栈图片,阻止呼叫的激活帧,在那里填写Hex。绘制分配内存的其他块(全局,动态,早期调用),并向它们绘制箭头以指示指针。