1

我的任务是在 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机器?

4

1 回答 1

3

实际上,在 C# 中对a 进行建模的方法unionFieldOffset是对所有成员进行相同的操作:

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

    [FieldOffset(0)]
    IntPtr hMonitor;
}

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

于 2013-02-03T15:32:50.083 回答