我的任务是在C#中为以下结构建模:

typedef struct _SHELLEXECUTEINFO {
  DWORD     cbSize;
  ULONG     fMask;
  HWND      hwnd;
  LPCTSTR   lpVerb;
  LPCTSTR   lpFile;
  LPCTSTR   lpParameters;
  LPCTSTR   lpDirectory;
  int       nShow;
  HINSTANCE hInstApp;
  LPVOID    lpIDList;
  LPCTSTR   lpClass;
  HKEY      hkeyClass;
  DWORD     dwHotKey;
  union {
    HANDLE hIcon;
    HANDLE hMonitor;
  } DUMMYUNIONNAME;
  HANDLE    hProcess;
} SHELLEXECUTEINFO, *LPSHELLEXECUTEINFO;

工会可以在这里这样建模
[StructLayout(LayoutKind.Explicit)]
struct Union
{
    [FieldOffset(0)]
    IntPtr hIcon;

    [FieldOffset(4)]
    IntPtr hMonitor;
}

这让我开始思考...由于IntPtr的大小从32位计算机上的4更改为64位计算机上的8,因此在使用FieldOffset的情况下如何补偿这一点,因为该示例显示32位的FieldOffset为4机?

最佳答案

实际上,C#中的the way to model a union 是为所有成员提供相同的FieldOffset:

[StructLayout(LayoutKind.Explicit)]
struct Union
{
    [FieldOffset(0)]
    IntPtr hIcon;

    [FieldOffset(0)]
    IntPtr hMonitor;
}

这使问题无济于事:每个IntPtr共享多少空间都没关系。

10-08 13:14