pointers - 如何将 lParam 转换为多个结构?

标签 pointers winapi struct casting lparam

我在here中看到了下面这段代码。我测试了一下,一切正常。

// g_hLink is the handle of the SysLink control.
case WM_NOTIFY:
    switch (((LPNMHDR)lParam)->code)            // CAST TO NMHDR*
    {
        case NM_CLICK:          // Fall through to the next case.
        case NM_RETURN:
        {
            PNMLINK pNMLink = (PNMLINK)lParam;  // CAST TO NMLINK*
            LITEM   item    = pNMLink->item;
            if ((((LPNMHDR)lParam)->hwndFrom == g_hLink) && (item.iLink == 0))
            {
                ShellExecute(NULL, L"open", item.szUrl, NULL, NULL, SW_SHOW);
            }
            else if (wcscmp(item.szID, L"idInfo") == 0)
            {
                MessageBox(hDlg, L"This isn't much help.", L"Example", MB_OK);
            }
            break;
        }
    }
    break;

参数lParam被转换为NMHDR*NMLINK*类型。 WM_NOTIFY的文档消息说 lParam 可以转换为 NMHDR*,但 NMLINK 是封装 NMHDR 的不同结构。

当我们将 lParam 转换为这两者之间任意选择的结构时,实际上会发生什么?

最佳答案

NMLINK 包含 NMHDR 作为其第一个元素:

struct NMLINK {
  NMHDR hdr;
  LITEM item;
};

因此,指向 NMLINK 的指针等于指向其第一个成员的指针(这是位于偏移量 0 处的 NMHDR 结构),它们是相同的。这意味着您可以将 NMHDR* 转换到 NMLINK*。

关于pointers - 如何将 lParam 转换为多个结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33061504/

相关文章:

winapi - 如何更改使用 DrawThemeTextEx 绘制的文本的发光颜色?

c++ - 如何将 SECURITY_ATTRIBUTES 与 CreateProcess() 一起使用?

go - 指针值在结构方法中更改后设置为零

c - 如何通过指针访问全局定义的 typedef 结构?

c# - 以编程方式断开远程桌面 session

c - 结构未按预期存储在内存中

c - 尝试从结构中打印字符串时运行失败

c - 访问结构体中的指针

pointers - 从克隆方法返回托管指针

pointers - 去指针第一次赋值