C++與C#數據類型對應關系總結


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

 

 

 

 

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++中的DLL函數原型為
  //extern "C" __declspec(dllexport) bool 方法名一(const char* 變量名1, unsigned char* 變量名2)
  //extern "C" __declspec(dllexport) bool 方法名二(const unsigned char* 變量名1, char* 變量名2)

  //C#調用C++的DLL搜集整理的所有數據類型轉換方式,可能會有重復或者多種方案,自己多測試
  //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(int) ---- c#:System.Int16
  //c++:INT(int) ---- c#:System.Int32  
  //c++:UINT(unsigned int) ---- c#:System.UInt16
  //c++:UINT(unsigned 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  
  //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
  /*
  * typedef void (*CALLBACKFUN1W)(wchar_t*, void* pArg);
  * typedef void (*CALLBACKFUN1A)(char*, void* pArg);
  * bool BIOPRINT_SENSOR_API dllFun1(CALLBACKFUN1 pCallbackFun1, void* pArg);
  * 調用方式為
  * [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
  * public delegate void CallbackFunc1([MarshalAs(UnmanagedType.LPWStr)] StringBuilder strName, IntPtr pArg);
  *  
  *  
  */

原文鏈接:https://blog.csdn.net/u010159842/article/details/51720458


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM