新聞中心
C#調(diào)用Windows API之參數(shù)類(lèi)型是什么樣子的呢?

C#調(diào)用Windows API之參數(shù)類(lèi)型1、
數(shù)值型直接用對(duì)應(yīng)的就可。
(DWORD -> int , WORD -> Int16)
C#調(diào)用Windows API之參數(shù)類(lèi)型2、
API中字符串指針類(lèi)型 -> .net中string
C#調(diào)用Windows API之參數(shù)類(lèi)型3、
API中句柄 (dWord) -> .net中IntPtr
C#調(diào)用Windows API之參數(shù)類(lèi)型4、
API中結(jié)構(gòu) -> .net中結(jié)構(gòu)或者類(lèi)。注意這種情況下,要先用StructLayout特性限定聲明結(jié)構(gòu)或類(lèi)
公共語(yǔ)言運(yùn)行庫(kù)利用StructLayoutAttribute控制類(lèi)或結(jié)構(gòu)的數(shù)據(jù)字段在托管內(nèi)存中的物理布局,即類(lèi)或結(jié)構(gòu)需要按某種方式排列。如果要將類(lèi)傳遞給需要指定布局的非托管代碼,則顯式控制類(lèi)布局是重要的。它的構(gòu)造函數(shù)中用LayoutKind值初始化 StructLayoutAttribute 類(lèi)的新實(shí)例。 LayoutKind.Sequential 用于強(qiáng)制將成員按其出現(xiàn)的順序進(jìn)行順序布局。
LayoutKind.Explicit 用于控制每個(gè)數(shù)據(jù)成員的精確位置。利用 Explicit, 每個(gè)成員必須使用 FieldOffsetAttribute 指示此字段在類(lèi)型中的位置。如:
- [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ù)類(lèi)型實(shí)例說(shuō)明:
下面是針對(duì)API中OSVERSIONINFO結(jié)構(gòu),在.net中定義對(duì)應(yīng)類(lèi)或結(jié)構(gòu)的例子:
- /**********************************************
- * API中定義原結(jié)構(gòu)聲明
- * OSVERSIONINFOA STRUCT
- * dwOSVersionInfoSize DWORD ?
- * dwMajorVersion DWORD ?
- * dwMinorVersion DWORD ?
- * dwBuildNumber DWORD ?
- * dwPlatformId DWORD ?
- * szCSDVersion BYTE 128 dup (?)
- * OSVERSIONINFOA ENDS
- *
- * OSVERSIONINFO equ
- *********************************************/
- //.net中聲明為類(lèi)
- [ 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é)構(gòu)
- [ 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ù)前綴并指定目標(biāo)需要的數(shù)據(jù)類(lèi)型。例如,以下代碼將兩個(gè)參數(shù)作為數(shù)據(jù)類(lèi)型長(zhǎng)指針?lè)馑徒o Windows API 函數(shù)的字符串 (LPStr):
- [MarshalAs(UnmanagedType.LPStr)]
- String existingfile;
- [MarshalAs(UnmanagedType.LPStr)]
- String newfile;
C#調(diào)用Windows API之參數(shù)類(lèi)型注意事項(xiàng):
注意結(jié)構(gòu)作為參數(shù)時(shí)候,一般前面要加上ref修飾符,否則會(huì)出現(xiàn)錯(cuò)誤:對(duì)象的引用沒(méi)有指定對(duì)象的實(shí)例。
- [ DllImport( "kernel32",
- EntryPoint="GetVersionEx" )]
- public static extern bool
- GetVersionEx2( ref OSVersionInfo2 osvi );
C#調(diào)用Windows API之參數(shù)類(lèi)型基本的情況就是這樣子的,希望通過(guò)介紹對(duì)你了解和學(xué)習(xí)C#調(diào)用Windows API之參數(shù)類(lèi)型有所幫助。
文章名稱(chēng):C#調(diào)用WindowsAPI之參數(shù)類(lèi)型淺析
標(biāo)題來(lái)源:http://www.dlmjj.cn/article/cogpidj.html


咨詢(xún)
建站咨詢(xún)
