C# 与 C++ 数据类型比较及结构体转换

时间:2024-12-10 00:05:38
C# 与 C++ 数据类型比较及结构体转换C++            C#
C# 与 C++ 数据类型比较及结构体转换=====================================
C# 与 C++ 数据类型比较及结构体转换WORD            ushort
C# 与 C++ 数据类型比较及结构体转换DWORD            uint
C# 与 C++ 数据类型比较及结构体转换UCHAR            int/byte   大部分情况都可以使用int代替,而如果需要严格对齐的话则应该用bytebyte 
C# 与 C++ 数据类型比较及结构体转换UCHAR*            string/IntPtr
C# 与 C++ 数据类型比较及结构体转换unsigned char*         [MarshalAs(UnmanagedType.LPArray)]byte[]/?(Intptr)
C# 与 C++ 数据类型比较及结构体转换char*            string
C# 与 C++ 数据类型比较及结构体转换LPCTSTR            string
C# 与 C++ 数据类型比较及结构体转换LPTSTR            [MarshalAs(UnmanagedType.LPTStr)] string
C# 与 C++ 数据类型比较及结构体转换long            int
C# 与 C++ 数据类型比较及结构体转换ulong               uint
C# 与 C++ 数据类型比较及结构体转换Handle            IntPtr
C# 与 C++ 数据类型比较及结构体转换HWND            IntPtr
C# 与 C++ 数据类型比较及结构体转换void*            IntPtr
C# 与 C++ 数据类型比较及结构体转换int            int
C# 与 C++ 数据类型比较及结构体转换int*            ref int
C# 与 C++ 数据类型比较及结构体转换*int            IntPtr
C# 与 C++ 数据类型比较及结构体转换unsigned int        uint
C# 与 C++ 数据类型比较及结构体转换COLORREF                uint 
C# 与 C++ 数据类型比较及结构体转换
C# 与 C++ 数据类型比较及结构体转换 
C# 与 C++ 数据类型比较及结构体转换
C# 与 C++ 数据类型比较及结构体转换 
C# 与 C++ 数据类型比较及结构体转换
C# 与 C++ 数据类型比较及结构体转换API与C#的数据类型对应关系表 
C# 与 C++ 数据类型比较及结构体转换API数据类型 类型描述 C#类型 API数据类型 类型描述 C#类型 
C# 与 C++ 数据类型比较及结构体转换WORD 16位无符号整数 ushort CHAR 字符 char 
C# 与 C++ 数据类型比较及结构体转换LONG 32位无符号整数 int DWORDLONG 64位长整数 long 
C# 与 C++ 数据类型比较及结构体转换DWORD 32位无符号整数 uint HDC 设备描述表句柄 int 
C# 与 C++ 数据类型比较及结构体转换HANDLE 句柄,32位整数 int HGDIOBJ GDI对象句柄 int 
C# 与 C++ 数据类型比较及结构体转换UINT 32位无符号整数 uint HINSTANCE 实例句柄 int 
C# 与 C++ 数据类型比较及结构体转换BOOL 32位布尔型整数 bool HWM 窗口句柄 int 
C# 与 C++ 数据类型比较及结构体转换LPSTR 指向字符的32位指针 string HPARAM 32位消息参数 int 
C# 与 C++ 数据类型比较及结构体转换LPCSTR 指向常字符的32位指针 String LPARAM 32位消息参数 int 
C# 与 C++ 数据类型比较及结构体转换BYTE 字节 byte WPARAM 32位消息参数 int 
C# 与 C++ 数据类型比较及结构体转换
C# 与 C++ 数据类型比较及结构体转换
C# 与 C++ 数据类型比较及结构体转换 
C# 与 C++ 数据类型比较及结构体转换
C# 与 C++ 数据类型比较及结构体转换 
C# 与 C++ 数据类型比较及结构体转换
C# 与 C++ 数据类型比较及结构体转换 
C# 与 C++ 数据类型比较及结构体转换
C# 与 C++ 数据类型比较及结构体转换BOOL=System.Int32
C# 与 C++ 数据类型比较及结构体转换BOOLEAN=System.Int32
C# 与 C++ 数据类型比较及结构体转换BYTE=System.UInt16
C# 与 C++ 数据类型比较及结构体转换CHAR=System.Int16
C# 与 C++ 数据类型比较及结构体转换COLORREF=System.UInt32
C# 与 C++ 数据类型比较及结构体转换DWORD=System.UInt32
C# 与 C++ 数据类型比较及结构体转换DWORD32=System.UInt32
C# 与 C++ 数据类型比较及结构体转换DWORD64=System.UInt64
C# 与 C++ 数据类型比较及结构体转换FLOAT=System.Float
C# 与 C++ 数据类型比较及结构体转换HACCEL=System.IntPtr
C# 与 C++ 数据类型比较及结构体转换HANDLE=System.IntPtr
C# 与 C++ 数据类型比较及结构体转换HBITMAP=System.IntPtr
C# 与 C++ 数据类型比较及结构体转换HBRUSH=System.IntPtr
C# 与 C++ 数据类型比较及结构体转换HCONV=System.IntPtr
C# 与 C++ 数据类型比较及结构体转换HCONVLIST=System.IntPtr
C# 与 C++ 数据类型比较及结构体转换HCURSOR=System.IntPtr
C# 与 C++ 数据类型比较及结构体转换HDC=System.IntPtr
C# 与 C++ 数据类型比较及结构体转换HDDEDATA=System.IntPtr
C# 与 C++ 数据类型比较及结构体转换HDESK=System.IntPtr
C# 与 C++ 数据类型比较及结构体转换HDROP=System.IntPtr
C# 与 C++ 数据类型比较及结构体转换HDWP=System.IntPtr
C# 与 C++ 数据类型比较及结构体转换HENHMETAFILE=System.IntPtr
C# 与 C++ 数据类型比较及结构体转换HFILE=System.IntPtr
C# 与 C++ 数据类型比较及结构体转换HFONT=System.IntPtr
C# 与 C++ 数据类型比较及结构体转换HGDIOBJ=System.IntPtr
C# 与 C++ 数据类型比较及结构体转换HGLOBAL=System.IntPtr
C# 与 C++ 数据类型比较及结构体转换HHOOK=System.IntPtr
C# 与 C++ 数据类型比较及结构体转换HICON=System.IntPtr
C# 与 C++ 数据类型比较及结构体转换HIMAGELIST=System.IntPtr
C# 与 C++ 数据类型比较及结构体转换HIMC=System.IntPtr
C# 与 C++ 数据类型比较及结构体转换HINSTANCE=System.IntPtr
C# 与 C++ 数据类型比较及结构体转换HKEY=System.IntPtr
C# 与 C++ 数据类型比较及结构体转换HLOCAL=System.IntPtr
C# 与 C++ 数据类型比较及结构体转换HMENU=System.IntPtr
C# 与 C++ 数据类型比较及结构体转换HMETAFILE=System.IntPtr
C# 与 C++ 数据类型比较及结构体转换HMODULE=System.IntPtr
C# 与 C++ 数据类型比较及结构体转换HMONITOR=System.IntPtr
C# 与 C++ 数据类型比较及结构体转换HPALETTE=System.IntPtr
C# 与 C++ 数据类型比较及结构体转换HPEN=System.IntPtr
C# 与 C++ 数据类型比较及结构体转换HRGN=System.IntPtr
C# 与 C++ 数据类型比较及结构体转换HRSRC=System.IntPtr
C# 与 C++ 数据类型比较及结构体转换HSZ=System.IntPtr
C# 与 C++ 数据类型比较及结构体转换HWINSTA=System.IntPtr
C# 与 C++ 数据类型比较及结构体转换HWND=System.IntPtr
C# 与 C++ 数据类型比较及结构体转换INT=System.Int32
C# 与 C++ 数据类型比较及结构体转换INT32=System.Int32
C# 与 C++ 数据类型比较及结构体转换INT64=System.Int64
C# 与 C++ 数据类型比较及结构体转换LONG=System.Int32
C# 与 C++ 数据类型比较及结构体转换LONG32=System.Int32
C# 与 C++ 数据类型比较及结构体转换LONG64=System.Int64
C# 与 C++ 数据类型比较及结构体转换LONGLONG=System.Int64
C# 与 C++ 数据类型比较及结构体转换LPARAM=System.IntPtr
C# 与 C++ 数据类型比较及结构体转换LPBOOL=System.Int16[]
C# 与 C++ 数据类型比较及结构体转换LPBYTE=System.UInt16[]
C# 与 C++ 数据类型比较及结构体转换LPCOLORREF=System.UInt32[]
C# 与 C++ 数据类型比较及结构体转换LPCSTR=System.String
C# 与 C++ 数据类型比较及结构体转换LPCTSTR=System.String
C# 与 C++ 数据类型比较及结构体转换LPCVOID=System.UInt32
C# 与 C++ 数据类型比较及结构体转换LPCWSTR=System.String
C# 与 C++ 数据类型比较及结构体转换LPDWORD=System.UInt32[]
C# 与 C++ 数据类型比较及结构体转换LPHANDLE=System.UInt32
C# 与 C++ 数据类型比较及结构体转换LPINT=System.Int32[]
C# 与 C++ 数据类型比较及结构体转换LPLONG=System.Int32[]
C# 与 C++ 数据类型比较及结构体转换LPSTR=System.String
C# 与 C++ 数据类型比较及结构体转换LPTSTR=System.String
C# 与 C++ 数据类型比较及结构体转换LPVOID=System.UInt32
C# 与 C++ 数据类型比较及结构体转换LPWORD=System.Int32[]
C# 与 C++ 数据类型比较及结构体转换LPWSTR=System.String
C# 与 C++ 数据类型比较及结构体转换LRESULT=System.IntPtr
C# 与 C++ 数据类型比较及结构体转换PBOOL=System.Int16[]
C# 与 C++ 数据类型比较及结构体转换PBOOLEAN=System.Int16[]
C# 与 C++ 数据类型比较及结构体转换PBYTE=System.UInt16[]
C# 与 C++ 数据类型比较及结构体转换PCHAR=System.Char[]
C# 与 C++ 数据类型比较及结构体转换PCSTR=System.String
C# 与 C++ 数据类型比较及结构体转换PCTSTR=System.String
C# 与 C++ 数据类型比较及结构体转换PCWCH=System.UInt32
C# 与 C++ 数据类型比较及结构体转换PCWSTR=System.UInt32
C# 与 C++ 数据类型比较及结构体转换PDWORD=System.Int32[]
C# 与 C++ 数据类型比较及结构体转换PFLOAT=System.Float[]
C# 与 C++ 数据类型比较及结构体转换PHANDLE=System.UInt32
C# 与 C++ 数据类型比较及结构体转换PHKEY=System.UInt32
C# 与 C++ 数据类型比较及结构体转换PINT=System.Int32[]
C# 与 C++ 数据类型比较及结构体转换PLCID=System.UInt32
C# 与 C++ 数据类型比较及结构体转换PLONG=System.Int32[]
C# 与 C++ 数据类型比较及结构体转换PLUID=System.UInt32
C# 与 C++ 数据类型比较及结构体转换PSHORT=System.Int16[]
C# 与 C++ 数据类型比较及结构体转换PSTR=System.String
C# 与 C++ 数据类型比较及结构体转换PTBYTE=System.Char[]
C# 与 C++ 数据类型比较及结构体转换PTCHAR=System.Char[]
C# 与 C++ 数据类型比较及结构体转换PTSTR=System.String
C# 与 C++ 数据类型比较及结构体转换PUCHAR=System.Char[]
C# 与 C++ 数据类型比较及结构体转换PUINT=System.UInt32[]
C# 与 C++ 数据类型比较及结构体转换PULONG=System.UInt32[]
C# 与 C++ 数据类型比较及结构体转换PUSHORT=System.UInt16[]
C# 与 C++ 数据类型比较及结构体转换PVOID=System.UInt32
C# 与 C++ 数据类型比较及结构体转换PWCHAR=System.Char[]
C# 与 C++ 数据类型比较及结构体转换PWORD=System.Int16[]
C# 与 C++ 数据类型比较及结构体转换PWSTR=System.String
C# 与 C++ 数据类型比较及结构体转换REGSAM=System.UInt32
C# 与 C++ 数据类型比较及结构体转换SC_HANDLE=System.IntPtr
C# 与 C++ 数据类型比较及结构体转换SC_LOCK=System.IntPtr
C# 与 C++ 数据类型比较及结构体转换SHORT=System.Int16
C# 与 C++ 数据类型比较及结构体转换SIZE_T=System.UInt32
C# 与 C++ 数据类型比较及结构体转换SSIZE_=System.UInt32
C# 与 C++ 数据类型比较及结构体转换TBYTE=System.Char
C# 与 C++ 数据类型比较及结构体转换TCHAR=System.Char
C# 与 C++ 数据类型比较及结构体转换UCHAR=System.Byte
C# 与 C++ 数据类型比较及结构体转换UINT=System.UInt32
C# 与 C++ 数据类型比较及结构体转换UINT32=System.UInt32
C# 与 C++ 数据类型比较及结构体转换UINT64=System.UInt64
C# 与 C++ 数据类型比较及结构体转换ULONG=System.UInt32
C# 与 C++ 数据类型比较及结构体转换ULONG32=System.UInt32
C# 与 C++ 数据类型比较及结构体转换ULONG64=System.UInt64
C# 与 C++ 数据类型比较及结构体转换ULONGLONG=System.UInt64
C# 与 C++ 数据类型比较及结构体转换USHORT=System.UInt16
C# 与 C++ 数据类型比较及结构体转换WORD=System.UInt16
C# 与 C++ 数据类型比较及结构体转换WPARAM=System.IntPtr
C# 与 C++ 数据类型比较及结构体转换
C# 与 C++ 数据类型比较及结构体转换<---------补充----------->
C# 与 C++ 数据类型比较及结构体转换
C# 与 C++ 数据类型比较及结构体转换Wtypes.h 中的非托管类型    非托管C 语言类型    托管类名       说明 
C# 与 C++ 数据类型比较及结构体转换HANDLE                        void*                   System.IntPtr  32 位 
C# 与 C++ 数据类型比较及结构体转换BYTE                            unsigned char       System.Byte    8 位 
C# 与 C++ 数据类型比较及结构体转换SHORT                         short                    System.Int16   16 位 
C# 与 C++ 数据类型比较及结构体转换WORD                          unsigned short      System.UInt16  16 位 
C# 与 C++ 数据类型比较及结构体转换INT                               int                       System.Int32   32 位 
C# 与 C++ 数据类型比较及结构体转换UINT                             unsigned int         System.UInt32  32 位 
C# 与 C++ 数据类型比较及结构体转换LONG                            long                    System.Int32   32 位 
C# 与 C++ 数据类型比较及结构体转换BOOL                            long                    System.Int32   32 位 
C# 与 C++ 数据类型比较及结构体转换DWORD                        unsigned long       System.UInt32  32 位 
C# 与 C++ 数据类型比较及结构体转换ULONG                          unsigned long      System.UInt32  32 位 
C# 与 C++ 数据类型比较及结构体转换CHAR                            char                    System.Char    用 ANSI 修饰。 
C# 与 C++ 数据类型比较及结构体转换LPSTR                           char*                  System.String 或 System.StringBuilder 用 ANSI 修饰。 
C# 与 C++ 数据类型比较及结构体转换LPCSTR                         Const char*         System.String 或 System.StringBuilder 用 ANSI 修饰。 
C# 与 C++ 数据类型比较及结构体转换LPWSTR                        wchar_t*             System.String 或 System.StringBuilder 用 Unicode 修饰。 
C# 与 C++ 数据类型比较及结构体转换LPCWSTR                      Const wchar_t*    System.String 或 System.StringBuilder 用 Unicode 修饰。 
C# 与 C++ 数据类型比较及结构体转换FLOAT                           Float                    System.Single 32 位 
C# 与 C++ 数据类型比较及结构体转换DOUBLE                        Double                 System.Double 64 位 
C# 与 C++ 数据类型比较及结构体转换
C# 与 C++ 数据类型比较及结构体转换 
C# 与 C++ 数据类型比较及结构体转换
C# 与 C++ 数据类型比较及结构体转换 
C# 与 C++ 数据类型比较及结构体转换
C# 与 C++ 数据类型比较及结构体转换C/C++中的结构类型数据在C#下的转换
C# 与 C++ 数据类型比较及结构体转换
C# 与 C++ 数据类型比较及结构体转换 
C# 与 C++ 数据类型比较及结构体转换在做项目移植的时候,经常会碰到数据类型的转换,而我这一次碰到的是C/C++中的结构怎样转换到C#。折腾了一个晚上终于有一个完美的方案。
C# 与 C++ 数据类型比较及结构体转换例如我们在C/C++下的结构数据如下:
C# 与 C++ 数据类型比较及结构体转换typedef struct 
C# 与 C++ 数据类型比较及结构体转换{
C# 与 C++ 数据类型比较及结构体转换    char sLibName[ 256 ];
C# 与 C++ 数据类型比较及结构体转换    char sPathToLibrary[ 256 ];
C# 与 C++ 数据类型比较及结构体转换    INT32        iEntries;
C# 与 C++ 数据类型比较及结构体转换    INT32        iUsed;
C# 与 C++ 数据类型比较及结构体转换    UINT16    iSort;
C# 与 C++ 数据类型比较及结构体转换    UINT16    iVersion;
C# 与 C++ 数据类型比较及结构体转换    BOOLEAN    fContainsSubDirectories;
C# 与 C++ 数据类型比较及结构体转换    INT32        iReserved;
C# 与 C++ 数据类型比较及结构体转换} LIBHEADER;
C# 与 C++ 数据类型比较及结构体转换我们想把它转成C#下的结构类型如下:
C# 与 C++ 数据类型比较及结构体转换    public struct LIBHEADER
C# 与 C++ 数据类型比较及结构体转换    {
C# 与 C++ 数据类型比较及结构体转换        public char[] sLibName;
C# 与 C++ 数据类型比较及结构体转换        public char[] sPathToLibrary;
C# 与 C++ 数据类型比较及结构体转换        public Int32 iEntries;
C# 与 C++ 数据类型比较及结构体转换        public Int32 iUsed;
C# 与 C++ 数据类型比较及结构体转换        public UInt16 iSort;
C# 与 C++ 数据类型比较及结构体转换        public UInt16 iVersion;
C# 与 C++ 数据类型比较及结构体转换        public Boolean fContainsSubDirectories;
C# 与 C++ 数据类型比较及结构体转换        public Int32 iReserved;
C# 与 C++ 数据类型比较及结构体转换    }
C# 与 C++ 数据类型比较及结构体转换看上去好像没问题了,呵呵呵,其实这样是不行的,我们得再给C#编译器一些信息,告诉它一些字符数组的大小。然后它们在C#下面长得样子就变成这样:
C# 与 C++ 数据类型比较及结构体转换    [StructLayout(LayoutKind.Sequential)]
C# 与 C++ 数据类型比较及结构体转换    public struct LIBHEADER
C# 与 C++ 数据类型比较及结构体转换    {
C# 与 C++ 数据类型比较及结构体转换        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
C# 与 C++ 数据类型比较及结构体转换        public char[] sLibName;
C# 与 C++ 数据类型比较及结构体转换        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
C# 与 C++ 数据类型比较及结构体转换        public char[] sPathToLibrary;
C# 与 C++ 数据类型比较及结构体转换        public Int32 iEntries;
C# 与 C++ 数据类型比较及结构体转换        public Int32 iUsed;
C# 与 C++ 数据类型比较及结构体转换        public UInt16 iSort;
C# 与 C++ 数据类型比较及结构体转换        public UInt16 iVersion;
C# 与 C++ 数据类型比较及结构体转换        public Boolean fContainsSubDirectories;
C# 与 C++ 数据类型比较及结构体转换        public Int32 iReserved;
C# 与 C++ 数据类型比较及结构体转换    }
C# 与 C++ 数据类型比较及结构体转换然后写一个函数负责转换。
C# 与 C++ 数据类型比较及结构体转换public StructType ConverBytesToStructure<StructType>(byte[] bytesBuffer)
C# 与 C++ 数据类型比较及结构体转换        {
C# 与 C++ 数据类型比较及结构体转换            // 检查长度。
C# 与 C++ 数据类型比较及结构体转换            if (bytesBuffer.Length != Marshal.SizeOf(typeof(StructType)))
C# 与 C++ 数据类型比较及结构体转换            {
C# 与 C++ 数据类型比较及结构体转换                throw new ArgumentException("bytesBuffer参数和structObject参数字节长度不一致。");
C# 与 C++ 数据类型比较及结构体转换            }
C# 与 C++ 数据类型比较及结构体转换
C# 与 C++ 数据类型比较及结构体转换            IntPtr bufferHandler = Marshal.AllocHGlobal(bytesBuffer.Length);
C# 与 C++ 数据类型比较及结构体转换            for (int index = 0; index < bytesBuffer.Length; index++)
C# 与 C++ 数据类型比较及结构体转换            {
C# 与 C++ 数据类型比较及结构体转换                Marshal.WriteByte(bufferHandler, index, bytesBuffer[index]);
C# 与 C++ 数据类型比较及结构体转换            }
C# 与 C++ 数据类型比较及结构体转换            StructType structObject = (StructType)Marshal.PtrToStructure(bufferHandler, typeof(StructType));
C# 与 C++ 数据类型比较及结构体转换            Marshal.FreeHGlobal(bufferHandler);
C# 与 C++ 数据类型比较及结构体转换            return structObject;
C# 与 C++ 数据类型比较及结构体转换        }
C# 与 C++ 数据类型比较及结构体转换然后我们的函数用例是这样:
C# 与 C++ 数据类型比较及结构体转换    FileStream file = File.OpenRead(@"D:\Jagged Alliance 2 Gold\INSTALL.LOG");
C# 与 C++ 数据类型比较及结构体转换    byte[] buffer = new byte[Marshal.SizeOf(typeof(LIBHEADER))];
C# 与 C++ 数据类型比较及结构体转换    file.Read(buffer, 0, buffer.Length);
C# 与 C++ 数据类型比较及结构体转换    LIBHEADER testValue = CommonTools.ConverBytesToStructure<LIBHEADER>(buffer);
C# 与 C++ 数据类型比较及结构体转换string libName = new string(testValue.sLibName);
C# 与 C++ 数据类型比较及结构体转换string pathToLibrary= new string(testValue.sPathToLibrary);
C# 与 C++ 数据类型比较及结构体转换OK,搞定。
C# 与 C++ 数据类型比较及结构体转换如果想去掉后面两句的char数组的转换哪代码如下
C# 与 C++ 数据类型比较及结构体转换C#中的结构代码
C# 与 C++ 数据类型比较及结构体转换    [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
C# 与 C++ 数据类型比较及结构体转换    public struct LIBHEADER
C# 与 C++ 数据类型比较及结构体转换    {
C# 与 C++ 数据类型比较及结构体转换        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
C# 与 C++ 数据类型比较及结构体转换        public string sLibName;
C# 与 C++ 数据类型比较及结构体转换        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
C# 与 C++ 数据类型比较及结构体转换        public string sPathToLibrary;
C# 与 C++ 数据类型比较及结构体转换        public Int32 iEntries;
C# 与 C++ 数据类型比较及结构体转换        public Int32 iUsed;
C# 与 C++ 数据类型比较及结构体转换        public UInt16 iSort;
C# 与 C++ 数据类型比较及结构体转换        public UInt16 iVersion;
C# 与 C++ 数据类型比较及结构体转换        public Boolean fContainsSubDirectories;
C# 与 C++ 数据类型比较及结构体转换        public Int32 iReserved;
C# 与 C++ 数据类型比较及结构体转换    }
C# 与 C++ 数据类型比较及结构体转换其它代码不用作修改便可使用。