在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#中建模union
的方法是向所有成员提供相同的FieldOffset
:
[StructLayout(LayoutKind.Explicit)]
struct Union
{
[FieldOffset(0)]
IntPtr hIcon;
[FieldOffset(0)]
IntPtr hMonitor;
}
这使得这个问题变得毫无意义:每个IntPtr
占用多少空间并不重要,因为它们正在共享空间