【问题标题】:Modelling C/C++ unions in C#在 C# 中建模 C/C++ 联合
【发布时间】:2013-01-18 09:41:03
【问题描述】:

我的任务是在 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 时对此进行补偿,因为示例显示 FieldOffset 为 4,对于 32 位机器?

【问题讨论】:

    标签: c# c++ pinvoke 32bit-64bit unions


    【解决方案1】:

    其实,C#中的the way to model a union就是给所有成员同样的FieldOffset

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

    这使问题变得毫无意义:每个IntPtr 占用多少空间都无关紧要,因为他们正在共享它。

    【讨论】:

      猜你喜欢
      • 2010-09-12
      • 1970-01-01
      • 1970-01-01
      • 2010-09-20
      • 2012-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多