您好,登錄后才能下訂單哦!
小編給大家分享一下C#調用Windows API之參數類型的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
C#調用Windows API之參數類型1、
數值型直接用對應的就可。
(DWORD -> int , WORD -> Int16)
C#調用Windows API之參數類型2、
API中字符串指針類型 -> .net中string
C#調用Windows API之參數類型3、
API中句柄 (dWord) -> .net中IntPtr
C#調用Windows API之參數類型4、
API中結構 -> .net中結構或者類。注意這種情況下,要先用StructLayout特性限定聲明結構或類
公共語言運行庫利用StructLayoutAttribute控制類或結構的數據字段在托管內存中的物理布局,即類或結構需要按某種方式排列。如果要將類傳遞給需要指定布局的非托管代碼,則顯式控制類布局是重要的。它的構造函數中用LayoutKind值初始化 StructLayoutAttribute 類的新實例。 LayoutKind.Sequential 用于強制將成員按其出現的順序進行順序布局。
LayoutKind.Explicit 用于控制每個數據成員的精確位置。利用 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#調用Windows API之參數類型實例說明:
下面是針對API中OSVERSIONINFO結構,在.net中定義對應類或結構的例子:
/********************************************** * API中定義原結構聲明 * 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中聲明為結構 [ 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特性,它用于描述字段、方法或參數的封送處理格式。用它作為參數前綴并指定目標需要的數據類型。例如,以下代碼將兩個參數作為數據類型長指針封送給 Windows API 函數的字符串 (LPStr):
[MarshalAs(UnmanagedType.LPStr)] String existingfile; [MarshalAs(UnmanagedType.LPStr)] String newfile;
C#調用Windows API之參數類型注意事項:
注意結構作為參數時候,一般前面要加上ref修飾符,否則會出現錯誤:對象的引用沒有指定對象的實例。
[ DllImport( "kernel32", EntryPoint="GetVersionEx" )] public static extern bool GetVersionEx2( ref OSVersionInfo2 osvi );
以上是“C#調用Windows API之參數類型的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。