zoukankan      html  css  js  c++  java
  • (转)C#与C++之间类型的对应

    C#与C++之间类型的对应

    Windows Data Type

    .NET Data Type

    BOOL, BOOLEAN

    Boolean or Int32

    BSTR

    String

    BYTE

    Byte

    CHAR

    Char

    DOUBLE

    Double

    DWORD

    Int32 or UInt32

    FLOAT

    Single

    HANDLE (and all other handle types, such as HFONT and HMENU)

    IntPtr, UintPtr or HandleRef

    HRESULT

    Int32 or UInt32

    INT

    Int32

    LANGID

    Int16 or UInt16

    LCID

    Int32 or UInt32

    LONG

    Int32

    LPARAM

    IntPtr, UintPtr or Object

    LPCSTR

    String

    LPCTSTR

    String

    LPCWSTR

    String

    LPSTR

    String or StringBuilder*

    LPTSTR

    String or StringBuilder

    LPWSTR

    String or StringBuilder

    LPVOID

    IntPtr, UintPtr or Object

    LRESULT

    IntPtr

    SAFEARRAY

    .NET array type

    SHORT

    Int16

    TCHAR

    Char

    UCHAR

    SByte

    UINT

    Int32 or UInt32

    ULONG

    Int32 or UInt32

    VARIANT

    Object

    VARIANT_BOOL

    Boolean

    WCHAR

    Char

    WORD

    Int16 or UInt16

    WPARAM

    IntPtr, UintPtr or Object

    另: 在进行string转换时,需要加入前缀[MarshalAs(UnmanagedType.LPStr)]lpdword 对应于 ref int

      

    C/C++

    C#

    HANDLE, LPDWORD, LPVOID, void*

    IntPtr

    LPCTSTR, LPCTSTR, LPSTR, char*, const char*, Wchar_t*, LPWSTR

    String [in], StringBuilder [in, out]

    DWORD, unsigned long, Ulong

    UInt32, [MarshalAs(UnmanagedType.U4)]

    bool

    bool

    LP<struct>

    [In] ref <struct>

    SIZE_T

    uint

    LPDWORD

    out uint

    LPTSTR

    [Out] StringBuilder

    PULARGE_INTEGER

    out ulong

    WORD

    uInt16

    Byte, unsigned char

    byte

    Short

    Int16

    Long, int

    Int32

    float

    single

    double

    double

    NULL pointer

    IntPtr.Zero

    Uint

    Uint32

     习惯用C#写东西,但平时又会碰到很多要用win32 API的地方,所以经常要用DllImport,但win32函数的类型写法是很庞杂的,相信为之困扰的不止我一个,现在我整理一份我个人的理解如下,希望高人不吝赐教。

    我的基本原则有如下几点:
    1、下面都是针对32位系统的,所以int是32位.long也是32位;
    2、各种句柄类的(H开头),我认为一律是System.IntPtr,到目前为止没发现出错;如果哪位在使用中出错,请指出;
    3、LP和P,我实在不懂(对C 不太了解),对于LP和P开头的函数,如果是和STR有关的,一律写为System.String,像PLCID这样指向什么东西的,写为System.UInt32(因为指向另一个地址,那就是指针,指针是32位吧),int之类的数值型,那我就写为int[],以方便.net程序引用(写成System.UInt32的话,给API调用应该也不会出错,但.net程序就不好引用了)

    如有意见,欢迎指教。谢谢

    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.

    Wtypes.h 中的非托管类型

    非托管 C 语言类型

    托管类名

    说明

    HANDLE

    void*

    System.IntPtr

    在 32 位 Windows 操作系统上为 32 位,在 64 位 Windows 操作系统上为 64 位。

    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.Text.StringBuilder

    用 ANSI 修饰。

    LPCSTR

    Const char*

    System.String 或   System.Text.StringBuilder

    用 ANSI 修饰。

    LPWSTR

    wchar_t*

    System.String 或   System.Text.StringBuilder

    用 Unicode 修饰。

    LPCWSTR

    Const wchar_t*

    System.String 或   System.Text.StringBuilder

    用 Unicode 修饰。

    FLOAT

    Float

    System.Single

    32 位

    DOUBLE

    Double

    System.Double

    64 位

    C++ dll 类型与 C#类型对应关系

            //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  
     
    4、C#调用C++dll的几种传参方式
    refer: http://www.camnpr.com/archives/293.html
    C#调用非托管DLL中的API:
     
    LONG APIENTRY devwdm_GetImageBuffer(BYTE *pImageMem);
      函数功能: 采集一帧RGB24图像到内存
      pImageMem: 图像缓冲区指针
     
    C#调用:
     
    C# code
     
    [DllImport("devwdm.dll")]
    public static extern int devwdm_GetImageBuffer(IntPtr pImageMem);

    于是报错:尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

    求助于大家,根据大家的意见,把API中的 BYTE* 转换到C#中,分别用 byte[] 、IntPtr 、ref byte[]、 ...甚至用unsafe了,可是还是报错,有人说内存不够大,于是我非配了很大的内存,扔报错...
     
    万般无奈,去C++的示例程序中看,示例程序中调用该函数没有任何问题。
    pImageMem是用来存放图象数据的缓冲区 字节数组(长*宽*3)
    lpsz是文件名(用于保存图象) 字符数组(Unicode/ANSI)
    devwdm_GetImageBuffer(pImageMem); 对字节数组赋值
    CT_SaveBmp(lpsz,pImageMem,m_strWideth,m_strHeight,0);以BMP格式保存
    CT_SaveJpeg(lpsz,pImageMem,m_strWideth,m_strHeight,0);以JPG格式保存
     
    以C#重写上述功能,要注意的几点:
    1,获取正确的m_strWideth和m_strHeight ,据此申请内存块:  
    IntPtr ptrImage = Marshal.AllocHGlobal(m_strWideth*m_strHeight*3);

    2,构建文件名,szFile是用户输入的字符串?  

    string filename = "XXX";
      IntPtr ptrFileName = Marshal.AllocHGlobal(filename.Length+1);
      Marshal.Copy(s.ToCharArray(), 0, ptrFileName, s.Length);

    3,获取图像数据:  

    devwdm_GetImageBuffer(ptrImage);

    4,保存BMP  

    CT_SaveBmp(ptrFileName,ptrImage,m_strWideth,m_strHeight,0);

    托管数组向非托管代码封送: 

    试试这样:
    如果有byte[] data字节数组,如下调用:
    devwdm_GetImageBuffer([In, MarshalAs( UnmanagedType.LPArray)] data); 

    或者手工转换成非托管数组:

    IntPtr ptr = Marshal.AllocHGlobal(data.Length);//申请非托管内存块(与data大小一样)
    Marshal.Copy(data,0,ptr,data.Length);//将托管数据复制到非托管数据
    devwdm_GetImageBuffer(ptr);//直接以非托管内存块地址为参数
    Marshal.FreeHGlobal(ptr);//处理完后记得释放内存

    发生错误的原因是devwdm_GetImageBuffer的参数的指针没有正确指到数据内存块,当指向受保护的系统内存块并且发生读写时,就会提示上述错误,与内存大小一点关系没有

    byte[] UUID2 = new byte[37];
    UUID2 = System.Text.Encoding.ASCII.GetBytes(Request["uid"].Trim());
    char& 和 int&  ,&是取地址,在c#中byte型的数组就是表示地址的,所以,对应的类型就是byte,如果是指定长度的char的话,要用byte[]  ,一定要指定长度,只可大不可小。具体咨询本站站长。
     
    本文转自网络
  • 相关阅读:
    gcc各个版本下载
    加减法运算解决乘除法
    蚂蚁碰撞的概率
    ns2.34移植leach协议
    ubantu16.04安装ns2.34 错误
    ubantu安全卸载火狐浏览器
    post和get的区别
    docker加速配置阿里云镜像
    重装系统后,会因为本机保存的公匙不对报错
    集合 set
  • 原文地址:https://www.cnblogs.com/HappyEDay/p/5442909.html
Copyright © 2011-2022 走看看