在使用WinAPI和C#時,需要進行數據類型轉換
- 基本數據類型:
- int(C#)<-> INT(WinAPI)
- uint(C#)<-> UINT(WinAPI)
- long(C#)<-> LONG(WinAPI)
- ulong(C#)<-> ULONG(WinAPI)
- short(C#)<-> SHORT(WinAPI)
- ushort(C#)<-> USHORT(WinAPI)
- byte(C#)<-> BYTE(WinAPI)
- bool(C#)<-> BOOL(WinAPI)
- char(C#)<-> CHAR(WinAPI)
- float(C#)<-> FLOAT(WinAPI)
- double(C#)<-> DOUBLE(WinAPI)
- 字符串:
- string(C#)<-> LPCTSTR(WinAPI)或者 LPCWSTR(WinAPI)
使用Marshal.StringToHGlobalAuto()將C#字符串轉換為LPCTSTR或LPCWSTR。
使用Marshal.PtrToStringAuto()將LPCTSTR或LPCWSTR轉換為C#字符串。
- 結構體:
- struct(C#)<-> WinAPI結構體
使用[StructLayout(LayoutKind.Sequential)]屬性標記C#結構體,以確保它們與WinAPI結構體兼容。
- 指針:
- IntPtr(C#)<-> LPVOID(WinAPI)或者其他指針類型
使用Marshal.AllocHGlobal()分配內存。
使用Marshal.FreeHGlobal()釋放內存。
使用Marshal.ReadInt32()、Marshal.WriteInt32()等方法讀寫內存中的數據。
- 數組:
- Array(C#)<-> 數組(WinAPI)
使用Marshal.Copy()方法在C#數組和WinAPI數組之間復制數據。
- 委托:
- delegate(C#)<-> 函數指針(WinAPI)
使用Marshal.GetFunctionPointerForDelegate()將C#委托轉換為函數指針。
使用Marshal.GetDelegateForFunctionPointer()將函數指針轉換為C#委托。
- 其他類型:
- 如果需要將其他C#類型轉換為WinAPI類型,可以使用System.Runtime.InteropServices命名空間中的Marshal類提供的方法。
注意:在進行數據類型轉換時,請確保正確處理內存分配和釋放,以避免內存泄漏和程序崩潰。