中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#調用Windows API之參數類型的示例分析

發布時間:2021-12-01 15:59:16 來源:億速云 閱讀:144 作者:小新 欄目:編程語言

小編給大家分享一下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之參數類型的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宁河县| 大庆市| 龙陵县| 东乡族自治县| 汉源县| 商城县| 万宁市| 稻城县| 松桃| 潞西市| 黑龙江省| 视频| 林西县| 大姚县| 青浦区| 双城市| 新宁县| 扎赉特旗| 永和县| 四子王旗| 旺苍县| 吴旗县| 运城市| 正阳县| 邓州市| 和政县| 汶川县| 砚山县| 呼玛县| 平顶山市| 布拖县| 义乌市| 高清| 勃利县| 临汾市| 中江县| 宝应县| 伊宁市| 右玉县| 会宁县| 芜湖县|