如何将lParam铸造成多个结构?

时间:2015-10-11 04:26:55

标签: 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转换为这两者之间任意选择的结构时,实际会发生什么?

1 个答案:

答案 0 :(得分:6)

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

struct NMLINK {
  NMHDR hdr;
  LITEM item;
};

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