zoukankan      html  css  js  c++  java
  • C# 调用C++ DLL 的类型转换(转载版)

      最近在做视频监控相关的demo开发,实现语言是C#,但视频监控的SDK是C++开发的,所以涉及到C#调用C++的dll库。很多结构体、参数在使用时都要先进行转换,由非托管类型转换成托管类型后才能使用。以下是查到的比较好用的类型转换总结。

    转载地址:http://www.cnblogs.com/blackice/archive/2013/05/23/3094653.html

      1 //C#调用C++的DLL搜集整理的所有数据类型转换方式,可能会有重复或者多种方案,自己多测试
      2    //c++:HANDLE(void *) ---- c#:System.IntPtr  
      3    //c++:Byte(unsigned char) ---- c#:System.Byte  
      4    //c++:SHORT(short) ---- c#:System.Int16  
      5    //c++:WORD(unsigned short) ---- c#:System.UInt16  
      6    //c++:INT(int) ---- c#:System.Int16
      7    //c++:INT(int) ---- c#:System.Int32  
      8    //c++:UINT(unsigned int) ---- c#:System.UInt16
      9    //c++:UINT(unsigned int) ---- c#:System.UInt32
     10    //c++:LONG(long) ---- c#:System.Int32  
     11    //c++:ULONG(unsigned long) ---- c#:System.UInt32  
     12    //c++:DWORD(unsigned long) ---- c#:System.UInt32  
     13    //c++:DECIMAL ---- c#:System.Decimal  
     14    //c++:BOOL(long) ---- c#:System.Boolean  
     15    //c++:CHAR(char) ---- c#:System.Char  
     16    //c++:LPSTR(char *) ---- c#:System.String  
     17    //c++:LPWSTR(wchar_t *) ---- c#:System.String  
     18    //c++:LPCSTR(const char *) ---- c#:System.String  
     19    //c++:LPCWSTR(const wchar_t *) ---- c#:System.String  
     20    //c++:PCAHR(char *) ---- c#:System.String  
     21    //c++:BSTR ---- c#:System.String  
     22    //c++:FLOAT(float) ---- c#:System.Single  
     23    //c++:DOUBLE(double) ---- c#:System.Double  
     24    //c++:VARIANT ---- c#:System.Object  
     25    //c++:PBYTE(byte *) ---- c#:System.Byte[]  
     26  
     27 
     28   //c++:BSTR ---- c#:StringBuilder
     29    //c++:LPCTSTR ---- c#:StringBuilder
     30    //c++:LPCTSTR ---- c#:string
     31    //c++:LPTSTR ---- c#:[MarshalAs(UnmanagedType.LPTStr)] string  
     32    //c++:LPTSTR 输出变量名 ---- c#:StringBuilder 输出变量名
     33    //c++:LPCWSTR ---- c#:IntPtr
     34    //c++:BOOL ---- c#:bool   
     35    //c++:HMODULE ---- c#:IntPtr   
     36    //c++:HINSTANCE ---- c#:IntPtr  
     37    //c++:结构体 ---- c#:public struct 结构体{};  
     38    //c++:结构体 **变量名 ---- c#:out 变量名 //C#中提前申明一个结构体实例化后的变量名
     39    //c++:结构体 &变量名 ---- c#:ref 结构体 变量名
     40      
     41  
     42 
     43   //c++:WORD ---- c#:ushort
     44    //c++:DWORD ---- c#:uint
     45    //c++:DWORD ---- c#:int
     46  
     47 
     48   //c++:UCHAR ---- c#:int
     49    //c++:UCHAR ---- c#:byte
     50    //c++:UCHAR* ---- c#:string
     51    //c++:UCHAR* ---- c#:IntPtr
     52  
     53 
     54   //c++:GUID ---- c#:Guid
     55    //c++:Handle ---- c#:IntPtr
     56    //c++:HWND ---- c#:IntPtr
     57    //c++:DWORD ---- c#:int
     58    //c++:COLORREF ---- c#:uint
     59  
     60 
     61 
     62 
     63   //c++:unsigned char ---- c#:byte
     64    //c++:unsigned char * ---- c#:ref byte
     65    //c++:unsigned char * ---- c#:[MarshalAs(UnmanagedType.LPArray)] byte[]
     66    //c++:unsigned char * ---- c#:[MarshalAs(UnmanagedType.LPArray)] Intptr
     67  
     68 
     69   //c++:unsigned char & ---- c#:ref byte
     70    //c++:unsigned char 变量名 ---- c#:byte 变量名
     71    //c++:unsigned short 变量名 ---- c#:ushort 变量名
     72    //c++:unsigned int 变量名 ---- c#:uint 变量名
     73    //c++:unsigned long 变量名 ---- c#:ulong 变量名
     74  
     75 
     76   //c++:char 变量名 ---- c#:byte 变量名 //C++中一个字符用一个字节表示,C#中一个字符用两个字节表示
     77    //c++:char 数组名[数组大小] ---- c#:MarshalAs(UnmanagedType.ByValTStr, SizeConst = 数组大小)] public string 数组名; ushort
     78  
     79 
     80   //c++:char * ---- c#:string //传入参数
     81    //c++:char * ---- c#:StringBuilder//传出参数
     82    //c++:char *变量名 ---- c#:ref string 变量名
     83    //c++:char *输入变量名 ---- c#:string 输入变量名
     84    //c++:char *输出变量名 ---- c#:[MarshalAs(UnmanagedType.LPStr)] StringBuilder 输出变量名
     85  
     86 
     87   //c++:char ** ---- c#:string
     88    //c++:char **变量名 ---- c#:ref string 变量名
     89    //c++:const char * ---- c#:string
     90    //c++:char[] ---- c#:string
     91    //c++:char 变量名[数组大小] ---- c#:[MarshalAs(UnmanagedType.ByValTStr,SizeConst=数组大小)] public string 变量名;  
     92  
     93 
     94   //c++:struct 结构体名 *变量名 ---- c#:ref 结构体名 变量名
     95    //c++:委托 变量名 ---- c#:委托 变量名
     96  
     97 
     98   //c++:int ---- c#:int
     99    //c++:int ---- c#:ref int
    100    //c++:int & ---- c#:ref int
    101    //c++:int * ---- c#:ref int //C#中调用前需定义int 变量名 = 0;
    102  
    103 
    104   //c++:*int ---- c#:IntPtr
    105    //c++:int32 PIPTR * ---- c#:int32[]
    106    //c++:float PIPTR * ---- c#:float[]
    107      
    108  
    109 
    110   //c++:double** 数组名 ---- c#:ref double 数组名
    111    //c++:double*[] 数组名 ---- c#:ref double 数组名
    112    //c++:long ---- c#:int
    113    //c++:ulong ---- c#:int
    114      
    115    //c++:UINT8 * ---- c#:ref byte //C#中调用前需定义byte 变量名 = new byte();   
    116  
    117 
    118 
    119 
    120   //c++:handle ---- c#:IntPtr
    121    //c++:hwnd ---- c#:IntPtr
    122      
    123      
    124    //c++:void * ---- c#:IntPtr   
    125    //c++:void * user_obj_param ---- c#:IntPtr user_obj_param
    126    //c++:void * 对象名称 ---- c#:([MarshalAs(UnmanagedType.AsAny)]Object 对象名称
    127  
    128 
    129 
    130 
    131     
    132    //c++:char, INT8, SBYTE, CHAR ---- c#:System.SByte   
    133    //c++:short, short int, INT16, SHORT ---- c#:System.Int16   
    134    //c++:int, long, long int, INT32, LONG32, BOOL , INT ---- c#:System.Int32   
    135    //c++:__int64, INT64, LONGLONG ---- c#:System.Int64   
    136    //c++:unsigned char, UINT8, UCHAR , BYTE ---- c#:System.Byte   
    137    //c++:unsigned short, UINT16, USHORT, WORD, ATOM, WCHAR , __wchar_t ---- c#:System.UInt16   
    138    //c++:unsigned, unsigned int, UINT32, ULONG32, DWORD32, ULONG, DWORD, UINT ---- c#:System.UInt32   
    139    //c++:unsigned __int64, UINT64, DWORDLONG, ULONGLONG ---- c#:System.UInt64   
    140    //c++:float, FLOAT ---- c#:System.Single   
    141    //c++:double, long double, DOUBLE ---- c#:System.Double   
    142  
    143 
    144   //Win32 Types ---- CLR Type   
    145      
    146  
    147 
    148   //Struct需要在C#里重新定义一个Struct
    149    //CallBack回调函数需要封装在一个委托里,delegate static extern int FunCallBack(string str);
    150  
    151 
    152   //unsigned char** ppImage替换成IntPtr ppImage
    153    //int& nWidth替换成ref int nWidth
    154    //int*, int&, 则都可用 ref int 对应
    155    //双针指类型参数,可以用 ref IntPtr
    156    //函数指针使用c++: typedef double (*fun_type1)(double); 对应 c#:public delegate double fun_type1(double);
    157    //char* 的操作c++: char*; 对应 c#:StringBuilder;
    158    //c#中使用指针:在需要使用指针的地方 加 unsafe
    159  
    160 
    161 
    162 
    163   //unsigned char对应public byte
    164    /*
    165    * typedef void (*CALLBACKFUN1W)(wchar_t*, void* pArg);
    166    * typedef void (*CALLBACKFUN1A)(char*, void* pArg);
    167    * bool BIOPRINT_SENSOR_API dllFun1(CALLBACKFUN1 pCallbackFun1, void* pArg);
    168    * 调用方式为
    169    * [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
    170    * public delegate void CallbackFunc1([MarshalAs(UnmanagedType.LPWStr)] StringBuilder strName, IntPtr pArg);
    171    *  
    172    *  
    173    */
  • 相关阅读:
    第十二章学习笔记
    UVa OJ 107 The Cat in the Hat (戴帽子的猫)
    UVa OJ 123 Searching Quickly (快速查找)
    UVa OJ 119 Greedy Gift Givers (贪婪的送礼者)
    UVa OJ 113 Power of Cryptography (密文的乘方)
    UVa OJ 112 Tree Summing (树的求和)
    UVa OJ 641 Do the Untwist (解密工作)
    UVa OJ 105 The Skyline Problem (地平线问题)
    UVa OJ 100 The 3n + 1 problem (3n + 1问题)
    UVa OJ 121 Pipe Fitters (装管子)
  • 原文地址:https://www.cnblogs.com/wanglin2016/p/6670563.html
Copyright © 2011-2022 走看看