C++与C#数据转换

//c++:HANDLE(void   *)                          ----    c#:System.IntPtr
//c++:Byte(unsigned   char)                     ----    c#:System.Byte
//c++:SHORT(short)                              ----    c#:System.Int16
//c++:WORD(unsigned   short)                    ----    c#:System.UInt16
//c++:INT(short int)                            ----    c#:System.Int16
//c++:INT(long int)                             ----    c#:System.Int32
//c++:UINT(unsigned short int)                  ----    c#:System.UInt16
//c++:UINT(unsigned long int)                   ----    c#:System.UInt32
//c++:LONG(long)                                ----    c#:System.Int32
//c++:ULONG(unsigned   long)                    ----    c#:System.UInt32
//c++:DWORD(unsigned   long)                    ----    c#:System.UInt32
//c++:DECIMAL                                   ----    c#:System.Decimal
//c++:BOOL(long)                                ----    c#:System.Boolean
//c++:CHAR(char)                                ----    c#:System.Char
//c++:LPSTR(char   *)                           ----    c#:System.String
//c++:LPWSTR(wchar_t   *)                       ----    c#:System.String
//c++:LPCSTR(const   char   *)                  ----    c#:System.String
//c++:LPCWSTR(const   wchar_t   *)              ----    c#:System.String
//c++:PCAHR(char   *)                           ----    c#:System.String
//c++:BSTR                                      ----    c#:System.String
//c++:FLOAT(float)                              ----    c#:System.Single(float)
//c++:DOUBLE(double)                            ----    c#:System.Double
//c++:VARIANT                                   ----    c#:System.Object
//c++:PBYTE(byte   *)                           ----    c#:System.Byte[]

//c++:BSTR                                      ----    c#:StringBuilder
//c++:LPCTSTR                                   ----    c#:StringBuilder
//c++:LPCTSTR                                   ----    c#:string
//c++:LPTSTR                                    ----    c#:[MarshalAs(UnmanagedType.LPTStr)] string
//c++:LPTSTR 输出变量名                         ----    c#:StringBuilder 输出变量名
//c++:LPCWSTR                                   ----    c#:IntPtr
//c++:BOOL                                      ----    c#:bool 
//c++:HMODULE                                   ----    c#:IntPtr  
//c++:HINSTANCE                                 ----    c#:IntPtr
//c++:结构体                                    ----    c#:public struct 结构体{};
//c++:结构体 **变量名                           ----    c#:out 变量名   //C#中提前申明一个结构体实例化后的变量名
//c++:结构体 &变量名                            ----    c#:ref 结构体 变量名
//c++:WORD                                      ----    c#:ushort
//c++:DWORD                                     ----    c#:uint
//c++:DWORD                                     ----    c#:int
//c++:UCHAR                                     ----    c#:int
//c++:UCHAR                                     ----    c#:byte
//c++:UCHAR*                                    ----    c#:string
//c++:UCHAR*                                    ----    c#:IntPtr
//c++:GUID                                      ----    c#:Guid
//c++:Handle                                    ----    c#:IntPtr
//c++:HWND                                      ----    c#:IntPtr
//c++:DWORD                                     ----    c#:int
//c++:COLORREF                                  ----    c#:uint


//c++:unsigned char                             ----    c#:byte
//c++:unsigned char *                           ----    c#:ref byte
//c++:unsigned char *                           ----    c#:[MarshalAs(UnmanagedType.LPArray)] byte[]
//c++:unsigned char *                           ----    c#:[MarshalAs(UnmanagedType.LPArray)] Intptr

//c++:unsigned char &                           ----    c#:ref byte
//c++:unsigned char 变量名                      ----    c#:byte 变量名
//c++:unsigned short 变量名                     ----    c#:ushort 变量名
//c++:unsigned int 变量名                       ----    c#:uint 变量名
//c++:unsigned long 变量名                      ----    c#:ulong 变量名

//c++:char 变量名                               ----    c#:byte 变量名   //C++中一个字符用一个字节表示,C#中一个字符用两个字节表示
//c++:char 数组名[数组大小]                     ----    c#:MarshalAs(UnmanagedType.ByValTStr, SizeConst         =         数组大小)]        public string 数组名; ushort

//c++:char *                                    ----    c#:string       //传入参数
//c++:char *                                    ----    c#:StringBuilder//传出参数
//c++:char *变量名                              ----    c#:ref string 变量名
//c++:char *输入变量名                          ----    c#:string 输入变量名
//c++:char *输出变量名                          ----    c#:[MarshalAs(UnmanagedType.LPStr)] StringBuilder 输出变量名

//c++:char **                                   ----    c#:string
//c++:char **变量名                             ----    c#:ref string 变量名
//c++:const char *                              ----    c#:string
//c++:char[]                                    ----    c#:string
//c++:char 变量名[数组大小]                     ----    c#:[MarshalAs(UnmanagedType.ByValTStr,SizeConst        =        数组大小)] public string 变量名;

//c++:struct 结构体名 *变量名                   ----    c#:ref 结构体名 变量名
//c++:委托 变量名                               ----    c#:委托 变量名

//c++:int                                       ----    c#:int
//c++:int                                       ----    c#:ref int
//c++:int &                                     ----    c#:ref int
//c++:int *                                     ----    c#:ref int      //C#中调用前需定义int 变量名         =         0;

//c++:*int                                      ----    c#:IntPtr
//c++:int32 PIPTR *                             ----    c#:int32[]
//c++:float PIPTR *                             ----    c#:float[]
      

//c++:double** 数组名                           ----    c#:ref double 数组名
//c++:double*[] 数组名                          ----    c#:ref double 数组名
//c++:long                                      ----    c#:int
//c++:ulong                                     ----    c#:int
      
//c++:UINT8 *                                   ----    c#:ref byte       //C#中调用前需定义byte 变量名         =         new byte();      


//c++:handle                                    ----    c#:IntPtr
//c++:hwnd                                      ----    c#:IntPtr      
//c++:void *                                    ----    c#:IntPtr      
//c++:void * user_obj_param                     ----    c#:IntPtr user_obj_param
//c++:void * 对象名称                           ----    c#:([MarshalAs(UnmanagedType.AsAny)]Object 对象名称


      
//c++:char, INT8, SBYTE, CHAR                               ----    c#:System.SByte
//c++:short, short int, INT16, SHORT                        ----    c#:System.Int16
//c++:int, long, long int, INT32, LONG32, BOOL , INT        ----    c#:System.Int32
//c++:__int64, INT64, LONGLONG                              ----    c#:System.Int64
//c++:unsigned char, UINT8, UCHAR , BYTE                    ----    c#:System.Byte
//c++:unsigned short, UINT16, USHORT, WORD, ATOM, WCHAR , __wchar_t             ----   c#:System.UInt16
//c++:unsigned, unsigned int, UINT32, ULONG32, DWORD32, ULONG, DWORD, UINT      ----   c#:System.UInt32
//c++:unsigned __int64, UINT64, DWORDLONG, ULONGLONG                            ----   c#:System.UInt64
//c++:float, FLOAT                                                              ----   c#:System.Single
//c++:double, long double, DOUBLE                                               ----   c#:System.Double

//Win32 Types                                                                   ----  CLR Type
      

//Struct需要在C#里重新定义一个Struct
//CallBack回调函数需要封装在一个委托里,delegate static extern int FunCallBack(string str);

//unsigned char** ppImage替换成IntPtr ppImage
//int& nWidth替换成ref int nWidth
//int*, int&, 则都可用 ref int 对应
//双针指类型参数,可以用 ref IntPtr
//函数指针使用c++: typedef double (*fun_type1)(double); 对应 c#:public delegate double fun_type1(double);
//char* 的操作c++: char*; 对应 c#:StringBuilder;
//c#中使用指针:在需要使用指针的地方 加 unsafe


//unsigned   char对应public   byte


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