<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    heting

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

     

    C++            C#
    =====================================
    WORD            
    ushort
    DWORD            
    uint
    UCHAR            
    int/byte   大部分情況都可以使用int代替,而如果需要嚴(yán)格對齊的話則應(yīng)該用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#的數(shù)據(jù)類型對應(yīng)關(guān)系表 
    API數(shù)據(jù)類型 類型描述 C#類型 API數(shù)據(jù)類型 類型描述 C#類型 
    WORD 16位無符號整數(shù) 
    ushort CHAR 字符 char 
    LONG 32位無符號整數(shù) 
    int DWORDLONG 64位長整數(shù) long 
    DWORD 32位無符號整數(shù) 
    uint HDC 設(shè)備描述表句柄 int 
    HANDLE 句柄,32位整數(shù) 
    int HGDIOBJ GDI對象句柄 int 
    UINT 32位無符號整數(shù) 
    uint HINSTANCE 實例句柄 int 
    BOOL 32位布爾型整數(shù) 
    bool HWM 窗口句柄 int 
    LPSTR 指向字符的32位指針 
    string HPARAM 32位消息參數(shù) int 
    LPCSTR 指向常字符的32位指針 String LPARAM 32位消息參數(shù) 
    int 
    BYTE 字節(jié) 
    byte WPARAM 32位消息參數(shù) 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++中的結(jié)構(gòu)類型數(shù)據(jù)在C#下的轉(zhuǎn)換

     
    在做項目移植的時候,經(jīng)常會碰到數(shù)據(jù)類型的轉(zhuǎn)換,而我這一次碰到的是C
    /C++中的結(jié)構(gòu)怎樣轉(zhuǎn)換到C#。折騰了一個晚上終于有一個完美的方案。
    例如我們在C
    /C++下的結(jié)構(gòu)數(shù)據(jù)如下:
    typedef 
    struct 
    {
        
    char sLibName[ 256 ];
        
    char sPathToLibrary[ 256 ];
        INT32        iEntries;
        INT32        iUsed;
        UINT16    iSort;
        UINT16    iVersion;
        BOOLEAN    fContainsSubDirectories;
        INT32        iReserved;
    }
     LIBHEADER;
    我們想把它轉(zhuǎn)成C#下的結(jié)構(gòu)類型如下:
        
    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#編譯器一些信息,告訴它一些字符數(shù)組的大小。然后它們在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;
        }

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


                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;
            }

    然后我們的函數(shù)用例是這樣:
        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數(shù)組的轉(zhuǎn)換哪代碼如下
    C#中的結(jié)構(gòu)代碼
        [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 賀挺 閱讀(7214) 評論(0)  編輯  收藏 所屬分類: c#范例
    主站蜘蛛池模板: 亚洲一区二区三区成人网站 | 久久综合久久综合亚洲| 西西人体44rt高清亚洲 | av免费不卡国产观看| 最近2019中文字幕免费大全5| 日本人成在线视频免费播放| 嫩草在线视频www免费看| 两个人看的www免费| 日本在线免费播放| 99精品视频免费在线观看| 日韩免费人妻AV无码专区蜜桃 | 日本亚洲中午字幕乱码| 国产精品亚洲а∨无码播放不卡 | 亚洲视频在线观看免费| 亚洲美女在线观看播放| 国产亚洲sss在线播放| 亚洲国产成人无码AV在线| 美女又黄又免费的视频| h视频在线观看免费| 花蝴蝶免费视频在线观看高清版| 久久免费高清视频| 四虎成年永久免费网站 | 在线播放免费人成毛片乱码| 国产一精品一AV一免费| 亚洲精品视频免费在线观看| 久久久久久久91精品免费观看| 天天干在线免费视频| 亚洲国产精品碰碰| 亚洲AV无码码潮喷在线观看| 亚洲妇女水蜜桃av网网站| 亚洲欧美自偷自拍另类视 | 亚洲性无码av在线| 亚洲日本一线产区和二线 | 亚洲午夜精品久久久久久app| 精品韩国亚洲av无码不卡区| 国产日韩久久免费影院| 亚欧色视频在线观看免费| 国产成人精品免费视频软件| 亚洲中文字幕在线第六区| 亚洲精品国产福利片| 久久久久久久久无码精品亚洲日韩|