C#調(diào)用Windows API之參數(shù)類型淺析
C#調(diào)用Windows API之參數(shù)類型是什么樣子的呢?
C#調(diào)用Windows API之參數(shù)類型1、
數(shù)值型直接用對應的就可。
(DWORD -> int , WORD -> Int16)
C#調(diào)用Windows API之參數(shù)類型2、
API中字符串指針類型 -> .net中string
C#調(diào)用Windows API之參數(shù)類型3、
API中句柄 (dWord) -> .net中IntPtr
C#調(diào)用Windows API之參數(shù)類型4、
API中結(jié)構 -> .net中結(jié)構或者類。注意這種情況下,要先用StructLayout特性限定聲明結(jié)構或類
公共語言運行庫利用StructLayoutAttribute控制類或結(jié)構的數(shù)據(jù)字段在托管內(nèi)存中的物理布局,即類或結(jié)構需要按某種方式排列。如果要將類傳遞給需要指定布局的非托管代碼,則顯式控制類布局是重要的。它的構造函數(shù)中用LayoutKind值初始化 StructLayoutAttribute 類的新實例。 LayoutKind.Sequential 用于強制將成員按其出現(xiàn)的順序進行順序布局。
LayoutKind.Explicit 用于控制每個數(shù)據(jù)成員的精確位置。利用 Explicit, 每個成員必須使用 FieldOffsetAttribute 指示此字段在類型中的位置。如:
- [StructLayout(LayoutKind.Explicit,
- Size=16, CharSet=CharSet.Ansi)]
- public class MySystemTime
- {
- [FieldOffset(0)]public ushort wYear;
- [FieldOffset(2)]public ushort wMonth;
- [FieldOffset(4)]public ushort wDayOfWeek;
- [FieldOffset(6)]public ushort wDay;
- [FieldOffset(8)]public ushort wHour;
- [FieldOffset(10)]public ushort wMinute;
- [FieldOffset(12)]public ushort wSecond;
- [FieldOffset(14)]public ushort wMilliseconds;
- }
C#調(diào)用Windows API之參數(shù)類型實例說明:
下面是針對API中OSVERSIONINFO結(jié)構,在.net中定義對應類或結(jié)構的例子:
- /**********************************************
- * API中定義原結(jié)構聲明
- * OSVERSIONINFOA STRUCT
- * dwOSVersionInfoSize DWORD ?
- * dwMajorVersion DWORD ?
- * dwMinorVersion DWORD ?
- * dwBuildNumber DWORD ?
- * dwPlatformId DWORD ?
- * szCSDVersion BYTE 128 dup (?)
- * OSVERSIONINFOA ENDS
- *
- * OSVERSIONINFO equ <OSVERSIONINFOA>
- *********************************************/
- //.net中聲明為類
- [ StructLayout( LayoutKind.Sequential )]
- public class OSVersionInfo
- {
- public int OSVersionInfoSize;
- public int majorVersion;
- public int minorVersion;
- public int buildNumber;
- public int platformId;
- [ MarshalAs( UnmanagedType.ByValTStr,
- SizeConst=128 )]
- public String versionString;
- }
- //或者
- //.net中聲明為結(jié)構
- [ StructLayout( LayoutKind.Sequential )]
- public struct OSVersionInfo2
- {
- public int OSVersionInfoSize;
- public int majorVersion;
- public int minorVersion;
- public int buildNumber;
- public int platformId;
- [ MarshalAs( UnmanagedType.ByValTStr,
- SizeConst=128 )]
- public String versionString;
- }
此例中用到MashalAs特性,它用于描述字段、方法或參數(shù)的封送處理格式。用它作為參數(shù)前綴并指定目標需要的數(shù)據(jù)類型。例如,以下代碼將兩個參數(shù)作為數(shù)據(jù)類型長指針封送給 Windows API 函數(shù)的字符串 (LPStr):
- [MarshalAs(UnmanagedType.LPStr)]
- String existingfile;
- [MarshalAs(UnmanagedType.LPStr)]
- String newfile;
C#調(diào)用Windows API之參數(shù)類型注意事項:
注意結(jié)構作為參數(shù)時候,一般前面要加上ref修飾符,否則會出現(xiàn)錯誤:對象的引用沒有指定對象的實例。
- [ DllImport( "kernel32",
- EntryPoint="GetVersionEx" )]
- public static extern bool
- GetVersionEx2( ref OSVersionInfo2 osvi );
C#調(diào)用Windows API之參數(shù)類型基本的情況就是這樣子的,希望通過介紹對你了解和學習C#調(diào)用Windows API之參數(shù)類型有所幫助。
【編輯推薦】