六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

C#中調(diào)用Windows API的重點(diǎn)

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


  一、調(diào)用格式

 using System.Runtime.InteropServices; //引用此名稱空間,簡(jiǎn)化后面的代碼
  ...
  //使用DllImportAttribute特性來(lái)引入api函數(shù),注意聲明的是空方法,即方法體為空。
  [DllImport("user32.dll")]
  public static extern ReturnType FunctionName(type arg1,type arg2,...);
  //調(diào)用時(shí)與調(diào)用其他方法并無(wú)區(qū)別

  可以使用字段進(jìn)一步說(shuō)明特性,用逗號(hào)隔開,如:

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

  DllImportAttribute特性的公共字段如下:
  1、CallingConvention 指示向非托管實(shí)現(xiàn)傳遞方法參數(shù)時(shí)所用的 CallingConvention 值。
  CallingConvention.Cdecl : 調(diào)用方清理堆棧。它使您能夠調(diào)用具有 varargs 的函數(shù)。
  CallingConvention.StdCall : 被調(diào)用方清理堆棧。它是從托管代碼調(diào)用非托管函數(shù)的默認(rèn)約定。

  2、CharSet 控制調(diào)用函數(shù)的名稱版本及指示如何向方法封送 String 參數(shù)。

  此字段被設(shè)置為 CharSet 值之一。如果 CharSet 字段設(shè)置為 Unicode,則所有字符串參數(shù)在傳遞到非托管實(shí)現(xiàn)之前都轉(zhuǎn)換成 Unicode 字符。這還導(dǎo)致向 DLL EntryPoint 的名稱中追加字母“W”。如果此字段設(shè)置為 Ansi,則字符串將轉(zhuǎn)換成 ANSI 字符串,同時(shí)向 DLL EntryPoint 的名稱中追加字母“A”。

  大多數(shù) Win32 API 使用這種追加“W”或“A”的約定。如果 CharSet 設(shè)置為 Auto,則這種轉(zhuǎn)換就是與平臺(tái)有關(guān)的(在 Windows NT 上為 Unicode,在 Windows 98 上為 Ansi)。CharSet 的默認(rèn)值為 Ansi。CharSet 字段也用于確定將從指定的 DLL 導(dǎo)入哪個(gè)版本的函數(shù)。

  CharSet.Ansi 和 CharSet.Unicode 的名稱匹配規(guī)則大不相同。對(duì)于 Ansi 來(lái)說(shuō),如果將 EntryPoint 設(shè)置為“MyMethod”且它存在的話,則返回“MyMethod”。如果 DLL 中沒有“MyMethod”,但存在“MyMethodA”,則返回“MyMethodA”。

  對(duì)于 Unicode 來(lái)說(shuō)則正好相反。如果將 EntryPoint 設(shè)置為“MyMethod”且它存在的話,則返回“MyMethodW”。如果 DLL 中不存在“MyMethodW”,但存在“MyMethod”,則返回“MyMethod”。如果使用的是 Auto,則匹配規(guī)則與平臺(tái)有關(guān)(在 Windows NT 上為 Unicode,在 Windows 98 上為 Ansi)。如果 ExactSpelling 設(shè)置為 true,則只有當(dāng) DLL 中存在“MyMethod”時(shí)才返回“MyMethod”。

  3、EntryPoint 指示要調(diào)用的 DLL 入口點(diǎn)的名稱或序號(hào)。
  如果你的方法名不想與api函數(shù)同名的話,一定要指定此參數(shù),例如:

[DllImport("user32.dll",CharSet="CharSet.Auto",EntryPoint="MessageBox")]
  public static extern int MsgBox(IntPtr hWnd,string txt,string caption, int type);

  4、ExactSpelling 指示是否應(yīng)修改非托管 DLL 中的入口點(diǎn)的名稱,以與 CharSet 字段中指定的 CharSet 值相對(duì)應(yīng)。如果為 true,則當(dāng) DllImportAttribute.CharSet 字段設(shè)置為 CharSet 的 Ansi 值時(shí),向方法名稱中追加字母 A,當(dāng) DllImportAttribute.CharSet 字段設(shè)置為 CharSet 的 Unicode 值時(shí),向方法的名稱中追加字母 W。此字段的默認(rèn)值是 false。

  5、PreserveSig 指示托管方法簽名不應(yīng)轉(zhuǎn)換成返回 HRESULT、并且可能有一個(gè)對(duì)應(yīng)于返回值的附加 [out, retval] 參數(shù)的非托管簽名。

  6、SetLastError 指示被調(diào)用方在從屬性化方法返回之前將調(diào)用 Win32 API SetLastError。 true 指示調(diào)用方將調(diào)用 SetLastError,默認(rèn)為 false。運(yùn)行時(shí)封送拆收器將調(diào)用 GetLastError 并緩存返回的值,以防其被其他 API 調(diào)用重寫。用戶可通過調(diào)用 GetLastWin32Error 來(lái)檢索錯(cuò)誤代碼。


[1] [2] [3]  下一頁(yè)




主站蜘蛛池模板: 欧美性猛交xxxx乱大交中文 | 亚洲国产成人久久一区二区三区 | 午夜a爱| 日韩一区二区久久久久久 | 日日av | 四虎网址换成什么了2021 | 天天干夜夜爽天天操夜夜爽视频 | 青青国产精品视频 | 欧美性猛交乱大交xxxx | 欧美整片第一页 | 外国一级毛片 | 欧美一级手机免费观看片 | 色综合久久综合网 | 日本理论片免费观看在线视频 | 日本视频播放 | 四虎永久在线观看免费网站网址 | 亚洲国产福利 | 婷婷深爱五月 | 三级在线国产 | 色噜噜狠狠网站 | 色老头网站久久网 | 中文字幕高清免费不卡视频 | 亚洲成人自拍网 | 欧美在线一级视频 | 天天久久综合 | 日韩免费视频一区 | 性香港xxxxx免费视频播放 | 亚洲成a人片在线观看www | 日本免费高清在线 | 午夜免费在线 | 五月婷婷欧美 | 亚洲国产精品久久久久666 | 欧美一区二区三区成人看不卡 | 亚洲伊人久久大香线蕉结合 | 午夜伦理视频 | 四虎www成人影院 | 日日干日日摸 | 日本欧美一区二区三区 | 日韩第六页 | 色色色色网站 | 人人爱人人插 |