各种语言数据类型对应关系/*==================================================================== =========(VC函数)函数名:SN_MakeGuestCard功能描述:发行客人卡输入参数:RoomNo--柜号:1~65535IssuedTime--发卡时间:年月日时分秒,字符串格式"YYYY-MM-DD hh:mm:ss"AllowHours--允许使用的小时数,0~1000,0表示不限时GuestFlags--客人卡标志输出参数:Rom--卡号:16个字符例子:RoomNo=1,IssuedTime="2010-01-0112:30:00",AllowHours=12,GuestFlags=0返回值:错误类型====================================================================== =======*/int__stdcall SN_MakeGuestCard(char*Rom,unsigned int RoomNo,char*IssuedTime,unsigned int AllowHours,unsigned int GuestFlags);C#调用C++的DLL搜集整理的所有数据类型转换方式时间:2011-03-1112:35:32来源:网络整理作者:未知点击:62次本以为这篇搜集整理的代码会是很不错的文章,花了一天时间,搜索到最后居然出来一篇叫做"C#与C++数据类型对照表"的文章.几乎囊括掉和大部分的数据了,太打击我了.本文中有部分的数据没有测试.也有一些不错的是看了本以为这篇搜集整理的代码会是很不错的文章,花了一天时间,搜索到最后居然出来一篇叫做"C#与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++:int32PIPTR*----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//Win32Types----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(CALLBACKFUN1pCallbackFun1,void* pArg);*调用方式为*[UnmanagedFunctionPointer(CallingConvention.Cdecl)]*public delegate void CallbackFunc1([MarshalAs(UnmanagedType.LPWStr)] StringBuilder strName,IntPtr pArg);***/本篇文章来源于:开发学院原文链接:/2011/0311/30006.php这里是VB引用VC写的DLLVC VBChar*ch String str;str=Space(10),在写函数参数时也应该写ByVal stras String但如果是结构体,那么在VC中若是char[20],在VB中就要写成bch(21)as ByteInt LongLong LongShort IntegerUNIT LongULONG LongWORD DWORDLongWPARAM LPARAMLongWMSG UMSGLongHRESULT LongBOOL BooleanCOLOREF LongHWND,HDC,HBRUSH,HKEY LongLPSTR LPCSTRStringVARIANT_BOOL BooleanUnsigned char ByteByte ByteChar byte这里是PB引用VC写的DLL指针在PB里面可以用REF引用或用LONG型变量来代替指針VC PB(16Bit)PB(32Bit)Bool Boolean BooleanByte,Char Char CharChar*Ref string Ref stringColorref Uint UlongDouble Double DoubleDword Uint UlongFloat N/A N/AHandle Uint UlongHdc Uint UlongHfile Uint UlongHinstance Uint UlongHwnd Uint UlonghWnd Uint UlongInt Int IntLong Long LongLparam Uint UlongLpbyte Ref int Ref longLpcwstr Ref Blob Ref BlobLpcvoid Ref string Ref stringLpdword Ref Uint Ref UlongLpfiletime Ref Time Ref TimeLpint Ref Int Ref LongLpstr,Lpcstr Ref String Ref StringLpvoid Ref Struct struce_inst Ref Struct struct_instLpword Long LongMcierror Long LongPbyte Ref Int[#]Ref Long[#]Short Int IntStructure Ref Struct strucr_inst Ref Struct struct_instUint Uint UintV oid**SUBROUTINE SUBROUTINEWord Int LongWparam Uint uint在PB10.5中的调用方法为:FUNCTION int SN_MakeGuestCard(ref string sRom,int RoomNo,ref string IssTime,int AllowsHours,int GuestFlags)LIBRARY"SnMakeCard.dll" Alias for"SN_MakeGuestCard;Ansi"在用的时候也要给string类型分配空间sRom=space(17)在PB9.0中,可以这样调用FUNCTION int SN_MakeGuestCard(ref char sRoma[20],integer sRoomNo,ref char sIssTime[24],integer sAllowsHours,integer sGuestFlags)LIBRARY "SnMakeCard.dll"alias for"SN_MakeGuestCard;Ansi"这里是Delphi引用VC写的DLLdelphi和vc基本数据类型对应关系unsigned long->dwordunsigned char->bytechar->charUINT->dword如果在VC用的是char*,如果是输出则在页面定义成array[0..64]of char;型,如果是输入,则定义成string型,在调用函数时将写成PChar(string)Delphi字长/值域C++ShortInt8位有符号整型Signed char SmallInt16位有符号整形ShortLongInt32位有符号整形IntByte8位无符号整形Unsigned char Word16位无符号整形Unsigned short Integer32位有符号整形IntCardinal32位无符号整形Unsigned int Boolean真/假BoolByteBool真/假或8位无符号整形Unsigned char WordBool真/假或16位无符号整形Unsigned short LongBool真.假或32位无符号整形BOOL(WinAPI) AnsiChar8位无符号字符CharWideChar宽字编码字符Wchar_tChar8位无符号字符CharAnsiString Delphi的字符串类AnsiString类String[n]老式的Delphi字符串,SmallString<n>模板类n=1..255SmallString<255> ShortString老式的Delphi字符串,255字节String Delphi的AnsiString类AnsiStringSingle32位浮点数FloatDouble64位浮点数DoubleExtended80位浮点数Long doubleReal32位浮点数DoublePointer32位类型指针V oid*Pchar32位字符型指针Unsigned char* PAnsiChar32位ANSI型字符指针Unsigned char* Comp64位浮点数Comp类OleVariant OLE可变类型值OleVariant类。