• 周六. 7月 2nd, 2022

5G编程聚合网

5G时代下一个聚合的编程学习网

热门标签

(转)C#与C++之间类型的对应

admin

11月 28, 2021

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[]  ,一定要指定长度,只可大不可小。具体咨询本站站长。
 
本文转自网络

发表评论

您的电子邮箱地址不会被公开。