亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#調用windows api的要點

2024-09-07 17:05:13
字體:
來源:轉載
供稿:網友

  在.Net Framework SDK文檔中,關于調用Windows API的指示比較零散,并且其中稍全面一點的是針對Visual Basic .net講述的。本文將C#中調用API的要點匯集如下,希望給未在C#中使用過API的朋友一點幫助。另外如果安裝了Visual Studio .net的話,在C:/Program Files/Microsoft Visual Studio .NET/FrameworkSDK/Samples/Technologies/Interop/PlatformInvoke/WinAPIs/CS目錄下有大量的調用API的例子。

  一、調用格式

  using System.Runtime.InteropServices; //引用此名稱空間,簡化后面的代碼

  ...

  //使用DllImportAttribute特性來引入api函數,注意聲明的是空方法,即方法體為空。

  [DllImport("user32.dll")]

  public static extern ReturnType FunctionName(type arg1,type arg2,...);

  //調用時候與調用其他方法并無區別

  DllImportAttribute特性的公共字段如下:

  1、CallingConvention 指示向非托管實現傳遞方法參數時所用的 CallingConvention 值。

  CallingConvention.Cdecl : 調用方清理堆棧。它使您能夠調用具有 varargs 的函數。

  CallingConvention.StdCall : 被調用方清理堆棧。它是從托管代碼調用非托管函數的默認約定。

  2、CharSet 控制調用函數的名稱版本及指示如何向方法封送 String 參數。

  此字段被設置為 CharSet 值之一。如果 CharSet 字段設置為 Unicode,則所有字符串參數在傳遞到非托管實現之前都轉換成 Unicode 字符。這還導致向 DLL EntryPoint 的名稱中追加字母“W”。如果此字段設置為 Ansi,則字符串將轉換成 ANSI 字符串,同時向 DLL EntryPoint 的名稱中追加字母“A”。大多數 Win32 API 使用這種追加“W”或“A”的約定。如果 CharSet 設置為 Auto,則這種轉換就是與平臺有關的(在 Windows NT 上為 Unicode,在 Windows 98 上為 Ansi)。CharSet 的默認值為 Ansi。CharSet 字段也用于確定將從指定的 DLL 導入哪個版本的函數。CharSet.Ansi 和 CharSet.Unicode 的名稱匹配規則大不相同。對于 Ansi 來說,如果將 EntryPoint 設置為“MyMethod”且它存在的話,則返回“MyMethod”。如果 DLL 中沒有“MyMethod”,但存在“MyMethodA”,則返回“MyMethodA”。對于 Unicode 來說則正好相反。如果將 EntryPoint 設置為“MyMethod”且它存在的話,則返回“MyMethodW”。如果 DLL 中不存在“MyMethodW”,但存在“MyMethod”,則返回“MyMethod”。如果使用的是 Auto,則匹配規則與平臺有關(在 Windows NT 上為 Unicode,在 Windows 98 上為 Ansi)。如果 ExactSpelling 設置為 true,則只有當 DLL 中存在“MyMethod”時才返回“MyMethod”。

  3、EntryPoint 指示要調用的 DLL 入口點的名稱或序號。

  如果你的方法名不想與api函數同名的話,一定要指定此參數,例如:

  [DllImport("user32.dll",CharSet="CharSet.Auto",EntryPoint="MessageBox")]

  public static extern int MsgBox(IntPtr hWnd,string txt,string caption, int type);

  4、ExactSpelling 指示是否應修改非托管 DLL 中的入口點的名稱,以與 CharSet 字段中指定的 CharSet 值相對應。如果為 true,則當 DllImportAttribute.CharSet 字段設置為 CharSet 的 Ansi 值時,向方法名稱中追加字母 A,當 DllImportAttribute.CharSet 字段設置為 CharSet 的 Unicode 值時,向方法的名稱中追加字母 W。此字段的默認值是 false。

  5、PreserveSig 指示托管方法簽名不應轉換成返回 HRESULT、并且可能有一個對應于返回值的附加 [out, retval] 參數的非托管簽名。

  6、SetLastError 指示被調用方在從屬性化方法返回之前將調用 Win32 API SetLastError。 true 指示調用方將調用 SetLastError,默認為 false。運行時封送拆收器將調用 GetLastError 并緩存返回的值,以防其被其他 API 調用重寫。用戶可通過調用 GetLastWin32Error 來檢索錯誤代碼。

  二、參數類型:

  1、數值型直接用對應的就可。

  2、字符串指針(api) -> string (.net)

  3、句柄 (dWord) -> IntPtr

  4、結構 -> 結構或者類

  這種情況下,要先用StructLayout特性限定聲明,例如:

  // declared as class

  [ 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;

  }

  // declared as struct

  [ 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;

  注意結構作為參數時候,一般前面要加上ref修飾符,否則會出現錯誤:對象的引用沒有指定對象的實例。

  [ DllImport( "kernel32", EntryPoint="GetVersionEx" )]

  public static extern bool GetVersionEx2( ref OSVersionInfo2 osvi );

 

共2頁上一頁12下一頁
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
最近2019好看的中文字幕免费| 国产精品久久久久久久久久久久久| 丁香五六月婷婷久久激情| 欧美激情va永久在线播放| 97精品国产91久久久久久| 久久天天躁狠狠躁老女人| 国产精品电影在线观看| 疯狂欧美牲乱大交777| 国产精品日日摸夜夜添夜夜av| 98视频在线噜噜噜国产| 欧美大成色www永久网站婷| 欧美在线视频导航| 国产精品久久久久秋霞鲁丝| 国产欧美中文字幕| 国语对白做受69| 亚洲奶大毛多的老太婆| 91干在线观看| 日韩国产欧美区| 成人中文字幕+乱码+中文字幕| 91中文字幕一区| 亚洲欧美激情另类校园| 亚洲欧美国产精品久久久久久久| 国模精品一区二区三区色天香| 国产精品专区h在线观看| 中文字幕精品久久久久| www.日韩系列| 欧美男插女视频| 欧美激情在线狂野欧美精品| 菠萝蜜影院一区二区免费| 亚洲欧美福利视频| 91欧美精品午夜性色福利在线| 欧美疯狂xxxx大交乱88av| 91av福利视频| 热re99久久精品国产66热| 久久久精品久久久久| 亚洲国产精品悠悠久久琪琪| 欧美第一淫aaasss性| 日韩成人性视频| 欧美精品激情blacked18| 国产亚洲精品美女久久久| 国产网站欧美日韩免费精品在线观看| 91精品国产九九九久久久亚洲| 国产色视频一区| 91视频-88av| 尤物yw午夜国产精品视频明星| 国产一区二中文字幕在线看| 午夜美女久久久久爽久久| 亚洲乱亚洲乱妇无码| 国产999视频| 一区二区欧美在线| 欧美另类暴力丝袜| 韩国欧美亚洲国产| 亚洲人成自拍网站| 久久影视电视剧免费网站| 日韩成人激情视频| 欧洲亚洲免费在线| 久久这里只有精品视频首页| 日本免费一区二区三区视频观看| 欧美成人久久久| 国产小视频91| 欧美成人一区二区三区电影| 青青青国产精品一区二区| 国产亚洲精品久久| 26uuu日韩精品一区二区| 日韩精品中文在线观看| 国产精品xxxxx| 久久91精品国产| 久久久久一本一区二区青青蜜月| 亚洲精品一区在线观看香蕉| 久久91精品国产91久久跳| 不卡伊人av在线播放| 91日本在线视频| 成人黄色免费网站在线观看| 欧美日韩国产在线看| 欧美激情高清视频| 国产精品一香蕉国产线看观看| 国产一区二区三区免费视频| 午夜精品一区二区三区视频免费看| 亚洲精品成人久久| 日韩av成人在线观看| 91理论片午午论夜理片久久| 久久精品国产亚洲精品| 日韩电影在线观看永久视频免费网站| 久久电影一区二区| 国产亚洲欧洲高清一区| 青青青国产精品一区二区| 精品呦交小u女在线| 久久91精品国产91久久跳| 91精品国产高清久久久久久91| 日韩av电影国产| 成人字幕网zmw| 日韩电影大全免费观看2023年上| 欧美在线亚洲一区| 91精品视频专区| 粉嫩老牛aⅴ一区二区三区| 日韩欧美一区二区在线| 秋霞av国产精品一区| 国产97在线|日韩| 久久99精品国产99久久6尤物| 亚洲免费福利视频| 韩国美女主播一区| 日韩av电影在线网| 亚洲国产精品久久久久秋霞蜜臀| 日韩免费高清在线观看| 伊人成人开心激情综合网| 久久亚洲春色中文字幕| 精品国产一区av| 亚洲a级在线观看| 国产精品久久久久久久久久ktv| 精品激情国产视频| 在线播放国产一区中文字幕剧情欧美| 国产精品黄页免费高清在线观看| 国产成人综合一区二区三区| 亚洲电影免费观看高清完整版| 久久精品成人动漫| 亚洲成人亚洲激情| 人人澡人人澡人人看欧美| 日本免费久久高清视频| 91高清视频免费| 国内外成人免费激情在线视频网站| 欧美日韩久久久久| 国产成人av在线播放| 国产欧美日韩中文字幕| 亚洲精品动漫100p| 午夜精品久久久久久99热软件| 亚洲人成在线电影| 亚洲欧美日韩成人| 国产精品久久久久久久久粉嫩av| 国产亚洲人成网站在线观看| 国产精品jizz在线观看麻豆| 欧美大成色www永久网站婷| 国产成人+综合亚洲+天堂| 午夜精品久久久久久久白皮肤| 久久久亚洲国产| 亚洲色图18p| 色综久久综合桃花网| 91产国在线观看动作片喷水| 亚洲精品美女久久久久| 国产精品wwww| 久久久这里只有精品视频| 亚洲深夜福利在线| 一个人www欧美| 亚洲免费视频一区二区| 日韩视频亚洲视频| 亚洲高清一区二| 亚洲午夜未满十八勿入免费观看全集| 超薄丝袜一区二区| 91九色视频导航| 日韩视频在线观看免费| 成人免费淫片视频软件| 亚洲国产成人在线视频| 日韩黄在线观看| 韩国精品美女www爽爽爽视频| 国产精品青青在线观看爽香蕉| 亚洲国产第一页| 久久资源免费视频| 最近的2019中文字幕免费一页| 日产精品99久久久久久| 中文字幕精品一区二区精品| 日韩国产精品亚洲а∨天堂免| 国产精品爱啪在线线免费观看| 成人久久久久久久| 亚洲国产成人在线播放| 狠狠躁夜夜躁人人爽天天天天97|