C++ C#
=====================================
WORD ushort
DWORD uint
UCHAR int/byte 大部分情況都可以使用int代替,而如果需要嚴格對齊的話則應該用bytebyte
UCHAR* string/IntPtr
unsigned char* [MarshalAs(UnmanagedType.LPArray)]byte[]/?(Intptr)
char* string
LPCTSTR string
LPTSTR [MarshalAs(UnmanagedType.LPTStr)] string
long int
ulong uint
Handle IntPtr
HWND IntPtr
void* IntPtr
int int
int* ref int
*int IntPtr
unsigned int uint
COLORREF uint
API與C#的數據類型對應關係表
|
|||||
API數據類型 | 類型描述 | C#類型 | API數據類型 | 類型描述 | C#類型 |
WORD | 16位無符號整數 | ushort | CHAR | 字符 | char |
LONG | 32位無符號整數 | int | DWORDLONG | 64位長整數 | long |
DWORD | 32位無符號整數 | uint | HDC | 設備描述表句柄 | int |
HANDLE | 句柄,32位整數 | int | HGDIOBJ | GDI對象句柄 | int |
UINT | 32位無符號整數 | uint | HINSTANCE | 實例句柄 | int |
BOOL | 32位布爾型整數 | bool | HWM | 窗口句柄 | int |
LPSTR | 指向字符的32位指針 | string | HPARAM | 32位消息參數 | int |
LPCSTR | 指向常字符的32位指針 | String | LPARAM | 32位消息參數 | int |
BYTE | 字節 | byte | WPARAM | 32位消息參數 | int |
BOOL=System.Int32
BOOLEAN=System.Int32
BYTE=System.UInt16
CHAR=System.Int16
COLORREF=System.UInt32
DWORD=System.UInt32
DWORD32=System.UInt32
DWORD64=System.UInt64
FLOAT=System.Float
HACCEL=System.IntPtr
HANDLE=System.IntPtr
HBITMAP=System.IntPtr
HBRUSH=System.IntPtr
HCONV=System.IntPtr
HCONVLIST=System.IntPtr
HCURSOR=System.IntPtr
HDC=System.IntPtr
HDDEDATA=System.IntPtr
HDESK=System.IntPtr
HDROP=System.IntPtr
HDWP=System.IntPtr
HENHMETAFILE=System.IntPtr
HFILE=System.IntPtr
HFONT=System.IntPtr
HGDIOBJ=System.IntPtr
HGLOBAL=System.IntPtr
HHOOK=System.IntPtr
HICON=System.IntPtr
HIMAGELIST=System.IntPtr
HIMC=System.IntPtr
HINSTANCE=System.IntPtr
HKEY=System.IntPtr
HLOCAL=System.IntPtr
HMENU=System.IntPtr
HMETAFILE=System.IntPtr
HMODULE=System.IntPtr
HMONITOR=System.IntPtr
HPALETTE=System.IntPtr
HPEN=System.IntPtr
HRGN=System.IntPtr
HRSRC=System.IntPtr
HSZ=System.IntPtr
HWINSTA=System.IntPtr
HWND=System.IntPtr
INT=System.Int32
INT32=System.Int32
INT64=System.Int64
LONG=System.Int32
LONG32=System.Int32
LONG64=System.Int64
LONGLONG=System.Int64
LPARAM=System.IntPtr
LPBOOL=System.Int16[]
LPBYTE=System.UInt16[]
LPCOLORREF=System.UInt32[]
LPCSTR=System.String
LPCTSTR=System.String
LPCVOID=System.UInt32
LPCWSTR=System.String
LPDWORD=System.UInt32[]
LPHANDLE=System.UInt32
LPINT=System.Int32[]
LPLONG=System.Int32[]
LPSTR=System.String
LPTSTR=System.String
LPVOID=System.UInt32
LPWORD=System.Int32[]
LPWSTR=System.String
LRESULT=System.IntPtr
PBOOL=System.Int16[]
PBOOLEAN=System.Int16[]
PBYTE=System.UInt16[]
PCHAR=System.Char[]
PCSTR=System.String
PCTSTR=System.String
PCWCH=System.UInt32
PCWSTR=System.UInt32
PDWORD=System.Int32[]
PFLOAT=System.Float[]
PHANDLE=System.UInt32
PHKEY=System.UInt32
PINT=System.Int32[]
PLCID=System.UInt32
PLONG=System.Int32[]
PLUID=System.UInt32
PSHORT=System.Int16[]
PSTR=System.String
PTBYTE=System.Char[]
PTCHAR=System.Char[]
PTSTR=System.String
PUCHAR=System.Char[]
PUINT=System.UInt32[]
PULONG=System.UInt32[]
PUSHORT=System.UInt16[]
PVOID=System.UInt32
PWCHAR=System.Char[]
PWORD=System.Int16[]
PWSTR=System.String
REGSAM=System.UInt32
SC_HANDLE=System.IntPtr
SC_LOCK=System.IntPtr
SHORT=System.Int16
SIZE_T=System.UInt32
SSIZE_=System.UInt32
TBYTE=System.Char
TCHAR=System.Char
UCHAR=System.Byte
UINT=System.UInt32
UINT32=System.UInt32
UINT64=System.UInt64
ULONG=System.UInt32
ULONG32=System.UInt32
ULONG64=System.UInt64
ULONGLONG=System.UInt64
USHORT=System.UInt16
WORD=System.UInt16
WPARAM=System.IntPtr
<---------補充----------->
Wtypes.h 中的非託管類型 非託管C 語言類型 託管類名 說明
HANDLE void* System.IntPtr 32 位
BYTE unsigned char System.Byte 8 位
SHORT short System.Int16 16 位
WORD unsigned short System.UInt16 16 位
INT int System.Int32 32 位
UINT unsigned int System.UInt32 32 位
LONG long System.Int32 32 位
BOOL long System.Int32 32 位
DWORD unsigned long System.UInt32 32 位
ULONG unsigned long System.UInt32 32 位
CHAR char System.Char 用 ANSI 修飾。
LPSTR char* System.String 或 System.StringBuilder 用 ANSI 修飾。
LPCSTR Const char* System.String 或 System.StringBuilder 用 ANSI 修飾。
LPWSTR wchar_t* System.String 或 System.StringBuilder 用 Unicode 修飾。
LPCWSTR Const wchar_t* System.String 或 System.StringBuilder 用 Unicode 修飾。
FLOAT Float System.Single 32 位
DOUBLE Double System.Double 64 位
C/C++中的結構類型數據在C#下的轉換
例如我們在C/C++下的結構數據如下:
typedef struct
{
char sLibName[ 256 ];
char sPathToLibrary[ 256 ];
INT32 iEntries;
INT32 iUsed;
UINT16 iSort;
UINT16 iVersion;
BOOLEAN fContainsSubDirectories;
INT32 iReserved;
} LIBHEADER;
我們想把它轉成C#下的結構類型如下:
public struct LIBHEADER
{
public char[] sLibName;
public char[] sPathToLibrary;
public Int32 iEntries;
public Int32 iUsed;
public UInt16 iSort;
public UInt16 iVersion;
public Boolean fContainsSubDirectories;
public Int32 iReserved;
}
看上去好像沒問題了,呵呵呵,其實這樣是不行的,我們得再給C#編譯器一些信息,告訴它一些字符數組的大小。然後它們在C#下面長得樣子就變成這樣:
[StructLayout(LayoutKind.Sequential)]
public struct LIBHEADER
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
public char[] sLibName;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
public char[] sPathToLibrary;
public Int32 iEntries;
public Int32 iUsed;
public UInt16 iSort;
public UInt16 iVersion;
public Boolean fContainsSubDirectories;
public Int32 iReserved;
}
然後寫一個函數負責轉換。
public StructType ConverBytesToStructure<StructType>(byte[] bytesBuffer)
{
// 檢查長度。
if (bytesBuffer.Length != Marshal.SizeOf(typeof(StructType)))
{
throw new ArgumentException("bytesBuffer參數和structObject參數字節長度不一致。");
}
IntPtr bufferHandler = Marshal.AllocHGlobal(bytesBuffer.Length);
for (int index = 0; index < bytesBuffer.Length; index++)
{
Marshal.WriteByte(bufferHandler, index, bytesBuffer[index]);
}
StructType structObject = (StructType)Marshal.PtrToStructure(bufferHandler, typeof(StructType));
Marshal.FreeHGlobal(bufferHandler);
return structObject;
}
然後我們的函數用例是這樣:
FileStream file = File.OpenRead(@"D:/Jagged Alliance 2 Gold/INSTALL.LOG");
byte[] buffer = new byte[Marshal.SizeOf(typeof(LIBHEADER))];
file.Read(buffer, 0, buffer.Length);
LIBHEADER testValue = CommonTools.ConverBytesToStructure<LIBHEADER>(buffer);
string libName = new string(testValue.sLibName);
string pathToLibrary= new string(testValue.sPathToLibrary);
OK,搞定。
如果想去掉後面兩句的char數組的轉換哪代碼如下
C#中的結構代碼
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
public struct LIBHEADER
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public string sLibName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public string sPathToLibrary;
public Int32 iEntries;
public Int32 iUsed;
public UInt16 iSort;
public UInt16 iVersion;
public Boolean fContainsSubDirectories;
public Int32 iReserved;
}
其它代碼不用作修改便可使用。