在C#中建模C/C++并集

本文关键字:C++ 并集 建模 | 更新日期: 2023-09-27 17:57:26

我的任务是在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变为8,在64位机器上为8,因此在使用FieldOffset时,考虑到示例显示32位机器的FieldOffset为4,我如何对此进行补偿?

在C#中建模C/C++并集

实际上,在C#中建模union的方法是向所有成员提供相同的FieldOffset

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

这使得这个问题变得毫无意义:每个IntPtr占用多少空间并不重要,因为它们正在共享空间