程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> [轉貼]C#中調用Windows API的要點

[轉貼]C#中調用Windows API的要點

編輯:.NET實例教程

C#中調用Windows API的要點


  在.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,...);
  //調用時與調用其他方法並無區別

  可以使用字段進一步說明特性,用逗號隔開,如:

    [ DllImport( "kernel32", EntryPoint="GetVersionEx" )]
  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”。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved