熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> ASP編程 >> 正文

C#中調用Windows API的要點

2013-11-15 14:09:40  來源: ASP編程 

  在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 SystemRuntimeInteropServices; //引用此名稱空間簡化後面的代碼
  
  //使用DllImportAttribute特性來引入api函數注意聲明的是空方法即方法體為空
  [DllImport(userdll)]
  public static extern ReturnType FunctionName(type argtype arg);
  //調用時與調用其他方法並無區別 
 
  可以使用字段進一步說明特性用逗號隔開[ DllImport( kernel EntryPoint=GetVersionEx )] 
 
  DllImportAttribute特性的公共字段如下
  
  CallingConvention 指示向非托管實現傳遞方法參數時所用的 CallingConvention 值
  CallingConventionCdecl : 調用方清理堆棧它使您能夠調用具有 varargs 的函數
  CallingConventionStdCall : 被調用方清理堆棧它是從托管代碼調用非托管函數的默認約定

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

  此字段被設置為 CharSet 值之一如果 CharSet 字段設置為 Unicode則所有字符串參數在傳遞到非托管實現之前都轉換成 Unicode 字符這還導致向 DLL EntryPoint 的名稱中追加字母W如果此字段設置為 Ansi則字符串將轉換成 ANSI 字符串同時向 DLL EntryPoint 的名稱中追加字母A

大多數 Win API 使用這種追加WA的約定如果 CharSet 設置為 Auto則這種轉換就是與平台有關的(在 Windows NT 上為 Unicode在 Windows 上為 Ansi)CharSet 的默認值為 AnsiCharSet 字段也用於確定將從指定的 DLL 導入哪個版本的函數

  CharSetAnsi 和 CharSetUnicode 的名稱匹配規則大不相同對於 Ansi 來說如果將 EntryPoint 設置為MyMethod且它存在的話則返回MyMethod如果 DLL 中沒有MyMethod但存在MyMethodA則返回MyMethodA

  對於 Unicode 來說則正好相反如果將 EntryPoint 設置為MyMethod且它存在的話則返回MyMethodW如果 DLL 中不存在MyMethodW但存在MyMethod則返回MyMethod如果使用的是 Auto則匹配規則與平台有關(在 Windows NT 上為 Unicode在 Windows 上為 Ansi)如果 ExactSpelling 設置為 true則只有當 DLL 中存在MyMethod時才返回MyMethod

  EntryPoint 指示要調用的 DLL 入口點的名稱或序號
  如果你的方法名不想與api函數同名的話一定要指定此參數例如
  [DllImport(userdllCharSet=CharSetAutoEntryPoint=MessageBox)]
  public static extern int MsgBox(IntPtr hWndstring txtstring caption int type);
 
  ExactSpelling 指示是否應修改非托管 DLL 中的入口點的名稱以與 CharSet 字段中指定的 CharSet 值相對應如果為 true則當 DllImportAttributeCharSet 字段設置為 CharSet 的 Ansi 值時向方法名稱中追加字母 A當 DllImportAttributeCharSet 字段設置為 CharSet 的 Unicode 值時向方法的名稱中追加字母 W此字段的默認值是 false

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

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


From:http://tw.wingwit.com/Article/program/ASP/201311/21895.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.