我的任务是在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
共享多少空间都没关系。