2013-02-03 141 views
1

工會我有造型在C#以下結構的任務:建模C/C++在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位機器,該如何補償?

回答

3

其實,the way to model a union在C#是給同一FieldOffset所有成員:

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

    [FieldOffset(0)] 
    IntPtr hMonitor; 
} 

這使得問題沒有實際意義:不要緊每個IntPtr佔用多少空間,因爲他們都共享它。

+0

啊哈!這清除了一切!謝謝! +1 – series0ne