heting

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            40 隨筆 :: 9 文章 :: 45 評論 :: 0 Trackbacks

           

          C++            C#
          =====================================
          WORD            
          ushort
          DWORD            
          uint
          UCHAR            
          int/byte   大部分情況都可以使用int代替,而如果需要嚴格對齊的話則應該用bytebyte 
          UCHAR
          *            string/IntPtr
          unsigned 
          char*         [MarshalAs(UnmanagedType.LPArray)]byte[]/?(Intptr)
          char*            string
          LPCTSTR            
          string
          LPTSTR            [MarshalAs(UnmanagedType.LPTStr)] 
          string
          long            int
          ulong               uint
          Handle            IntPtr
          HWND            IntPtr
          void*            IntPtr
          int            int
          int*            ref int
          *int            IntPtr
          unsigned 
          int        uint
          COLORREF                
          uint 

           

           

          API與C#的數據類型對應關系表 
          API數據類型 類型描述 C#類型 API數據類型 類型描述 C#類型 
          WORD 16位無符號整數 
          ushort CHAR 字符 char 
          LONG 32位無符號整數 
          int DWORDLONG 64位長整數 long 
          DWORD 32位無符號整數 
          uint HDC 設備描述表句柄 int 
          HANDLE 句柄,32位整數 
          int HGDIOBJ GDI對象句柄 int 
          UINT 32位無符號整數 
          uint HINSTANCE 實例句柄 int 
          BOOL 32位布爾型整數 
          bool HWM 窗口句柄 int 
          LPSTR 指向字符的32位指針 
          string HPARAM 32位消息參數 int 
          LPCSTR 指向常字符的32位指針 String LPARAM 32位消息參數 
          int 
          BYTE 字節 
          byte WPARAM 32位消息參數 int 


           

           

           

          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.Byte
          UINT
          =System.UInt32
          UINT32
          =System.UInt32
          UINT64
          =System.UInt64
          ULONG
          =System.UInt32
          ULONG32
          =System.UInt32
          ULONG64
          =System.UInt64
          ULONGLONG
          =System.UInt64
          USHORT
          =System.UInt16
          WORD
          =System.UInt16
          WPARAM
          =System.IntPtr

          <---------補充----------->

          Wtypes.h 中的非托管類型    非托管C 語言類型    托管類名       說明 
          HANDLE                        
          void*                   System.IntPtr  32 位 
          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.StringBuilder 用 ANSI 修飾。 
          LPCSTR                         Const 
          char*         System.String 或 System.StringBuilder 用 ANSI 修飾。 
          LPWSTR                        wchar_t
          *             System.String 或 System.StringBuilder 用 Unicode 修飾。 
          LPCWSTR                      Const wchar_t
          *    System.String 或 System.StringBuilder 用 Unicode 修飾。 
          FLOAT                           Float                    System.Single 
          32 位 
          DOUBLE                        Double                 System.Double 
          64 位 

           

           

          C
          /C++中的結構類型數據在C#下的轉換

           
          在做項目移植的時候,經常會碰到數據類型的轉換,而我這一次碰到的是C
          /C++中的結構怎樣轉換到C#。折騰了一個晚上終于有一個完美的方案。
          例如我們在C
          /C++下的結構數據如下:
          typedef 
          struct 
          {
              
          char sLibName[ 256 ];
              
          char sPathToLibrary[ 256 ];
              INT32        iEntries;
              INT32        iUsed;
              UINT16    iSort;
              UINT16    iVersion;
              BOOLEAN    fContainsSubDirectories;
              INT32        iReserved;
          }
           LIBHEADER;
          我們想把它轉成C#下的結構類型如下:
              
          public struct LIBHEADER
              
          {
                  
          public char[] sLibName;
                  
          public char[] sPathToLibrary;
                  
          public Int32 iEntries;
                  
          public Int32 iUsed;
                  
          public UInt16 iSort;
                  
          public UInt16 iVersion;
                  
          public Boolean fContainsSubDirectories;
                  
          public Int32 iReserved;
              }

          看上去好像沒問題了,呵呵呵,其實這樣是不行的,我們得再給C#編譯器一些信息,告訴它一些字符數組的大小。然后它們在C#下面長得樣子就變成這樣:
              [StructLayout(LayoutKind.Sequential)]
              
          public struct LIBHEADER
              
          {
                  [MarshalAs(UnmanagedType.ByValArray, SizeConst 
          = 256)]
                  
          public char[] sLibName;
                  [MarshalAs(UnmanagedType.ByValArray, SizeConst 
          = 256)]
                  
          public char[] sPathToLibrary;
                  
          public Int32 iEntries;
                  
          public Int32 iUsed;
                  
          public UInt16 iSort;
                  
          public UInt16 iVersion;
                  
          public Boolean fContainsSubDirectories;
                  
          public Int32 iReserved;
              }

          然后寫一個函數負責轉換。
          public StructType ConverBytesToStructure<StructType>(byte[] bytesBuffer)
                  
          {
                      
          // 檢查長度。
                      if (bytesBuffer.Length != Marshal.SizeOf(typeof(StructType)))
                      
          {
                          
          throw new ArgumentException("bytesBuffer參數和structObject參數字節長度不一致。");
                      }


                      IntPtr bufferHandler 
          = Marshal.AllocHGlobal(bytesBuffer.Length);
                      
          for (int index = 0; index < bytesBuffer.Length; index++)
                      
          {
                          Marshal.WriteByte(bufferHandler, index, bytesBuffer[index]);
                      }

                      StructType structObject 
          = (StructType)Marshal.PtrToStructure(bufferHandler, typeof(StructType));
                      Marshal.FreeHGlobal(bufferHandler);
                      
          return structObject;
                  }

          然后我們的函數用例是這樣:
              FileStream file 
          = File.OpenRead(@"D:\Jagged Alliance 2 Gold\INSTALL.LOG");
              
          byte[] buffer = new byte[Marshal.SizeOf(typeof(LIBHEADER))];
              file.Read(buffer, 
          0, buffer.Length);
              LIBHEADER testValue 
          = CommonTools.ConverBytesToStructure<LIBHEADER>(buffer);
          string libName = new string(testValue.sLibName);
          string pathToLibrary= new string(testValue.sPathToLibrary);
          OK,搞定。
          如果想去掉后面兩句的char數組的轉換哪代碼如下
          C#中的結構代碼
              [StructLayout(LayoutKind.Sequential, CharSet
          =CharSet.Ansi)]
              
          public struct LIBHEADER
              
          {
                  [MarshalAs(UnmanagedType.ByValTStr, SizeConst 
          = 256)]
                  
          public string sLibName;
                  [MarshalAs(UnmanagedType.ByValTStr, SizeConst 
          = 256)]
                  
          public string sPathToLibrary;
                  
          public Int32 iEntries;
                  
          public Int32 iUsed;
                  
          public UInt16 iSort;
                  
          public UInt16 iVersion;
                  
          public Boolean fContainsSubDirectories;
                  
          public Int32 iReserved;
              }

          其它代碼不用作修改便可使用。

           
          posted on 2010-03-20 10:40 賀挺 閱讀(7217) 評論(0)  編輯  收藏 所屬分類: c#范例
          主站蜘蛛池模板: 衢州市| 安福县| 体育| 瑞安市| 托里县| 平遥县| 绥化市| 凌源市| 若羌县| 乌兰县| 毕节市| 万源市| 苍南县| 麻阳| 贵溪市| 晋中市| 富源县| 柏乡县| 兴山县| 庄浪县| 集安市| 柳州市| 贵阳市| 乐东| 达拉特旗| 会同县| 犍为县| 白水县| 高雄市| 襄垣县| 太谷县| 宁武县| 清徐县| 新昌县| 东乌珠穆沁旗| 库尔勒市| 拉孜县| 北流市| 孝义市| 外汇| 青川县|