I'm doing a lot of PInvoking lately. One of the hard parts is mapping the unmanaged datatypes found in c++ include files to managed datatypes.
I found a nice article on codeproject with a list of the most common mappings. I'll repeat the list here so I can find it easilly, maybe other people can benefit from it too. I'll keep the list up-to-date with my own mappings and some remarks.
Unmanaged | Managed | Remarks |
BOOL, BOOLEAN | Boolean, Int32 | A 32 bit field set to 0 for FALSE and 1 for TRUE |
BSTR | String | |
BYTE | SByte | Signed byte, the original article has BYTE and UBYTE switched around. |
CHAR | Char | CHAR is single byte ANSI character, Char is a dual byte Unicode character. Byte may be a better mapping. |
DOUBLE | Double | |
DWORD | UInt32 | The original article also said Int32, but DWORD is always unsigned |
FLOAT | Single | |
GUID | Guid | GUID is actually a c struct consisting of different integer values. The framework marshalls this to a Guid value. |
HANDLE | IntPtr | 32 bits on x86, 64 bits on 64 bit platforms. Also used for other handles like HFONT and HMENU |
HRESULT | Int32 | The original artilcle also said UInt32 but HRESULT is defined as signed |
INT | Int32 | |
LANGID | Int16 or UInt16 | |
LCID | Int32 or UInt32 | |
LONG | Int32 | |
LPARAM | IntPtr, UIntPtr or Object | Value can represent different things depending on context. 32 or 64 bits depending on platform. |
LPCSTR, LPCTSTR, LPCWSTR | String | |
LPSTR, LPTSTR, LPWSTR | String | String is immutable so use StringBuilder instead of String if the string can change in unmanaged code |
LPVOID | IntPtr, UIntPtr or Object | |
LRESULT | IntPtr | Value can represent different things depending on context. 32 or 64 bits depending on platform. |
SAFEARRAY | .NET array type | |
SHORT | Int16 | |
TCHAR | Char | |
UCHAR | Byte | |
UINT | UInt32 | |
ULONG | UInt32 | |
UUID | Guid | Not sure if this works. GUID and UUID datatype are about the same so it should. |
VARIANT | Object | |
VARIANT_BOOL | Boolean | |
WCHAR | Char | 16 bit Unicode character |
WORD | UInt16 | The original article also said Int32 but WORD is unsigned only. |
WPARAM | IntPtr, UIntPtr or Object | Value can represent different things depending on context. 32 or 64 bits depending on platform. |
Most of the unmanaged datatypes are defined in windef.h. Microsoft has a page on MSDN here with descriptions.
Comments
Post a Comment