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

How can lParam be casted into more than one structures?

我在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;

The parameter lParam is casted to both NMHDR* and NMLINK* types. The documentation of WM_NOTIFY message says that lParam can be cast to NMHDR*, 但 NMLINK 是一个不同的结构封装 NMHDR.

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

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

struct NMLINK {
  NMHDR hdr;
  LITEM item;
};

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