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

hkB*_*sai 2 winapi struct pointers casting lparam

我在这里看到了下面这段代码.我测试了它,它可以正常工作.

// 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;
Run Code Online (Sandbox Code Playgroud)

该参数lParam将转换为两者NMHDR*和NMLINK*类型.WM_NOTIFY消息的文档说lParam可以转换为NMHDR*,但是NMLINK是一个封装的不同结构NMHDR.

当我们lParam在这两者之间选择任意选择的结构时会发生什么?

c-s*_*ile 6

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

struct NMLINK {
  NMHDR hdr;
  LITEM item;
};
Run Code Online (Sandbox Code Playgroud)

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

  • 填充很重要,但不适用于结构的第一个成员.它始终从结构前部的偏移0开始. (3认同)