程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#中使用Win32類庫(3)

C#中使用Win32類庫(3)

編輯:關於C語言

其他高級函數

迄今為止我列出的示例都比較簡單,但是還有很多更復雜的 Win32 函數。下面是一個示例:

DWord SetEntrIEsInAcl(
  ULONG cCountOfExplicitEntrIEs,      // 項數
  PEXPLICIT_Access pListOfExplicitEntrIEs, // 緩沖區
  PACL OldAcl,               // 原始 ACL
  PACL *NewAcl               // 新 ACL
);

前兩個參數的處理比較簡單:ulong 很簡單,並且可以使用 UnmanagedType.LPArray 來封送緩沖區。

但第三和第四個參數有一些問題。問題在於定義 ACL 的方式。ACL 結構僅定義了 ACL 標頭,而緩沖區的其余部分由 ACE 組成。ACE 可以具有多種不同類型,並且這些不同類型的 ACE 的長度也不同。

如果您願意為所有緩沖區分配空間,並且願意使用不太安全的代碼,則可以用 C# 進行處理。但工作量很大,並且程序非常難調試。而使用 C++ 處理此 API 就容易得多。

屬性的其他選項

DLLImport 和 StructLayout 屬性具有一些非常有用的選項,有助於 P/Invoke 的使用。下面列出了所有這些選項:

DLLImport

CallingConvention

您可以用它來告訴封送拆收器,函數使用了哪些調用約定。您可以將它設置為您的函數的調用約定。通常,如果此設置錯誤,代碼將不能執行。但是,如果您的函數是 Cdecl 函數,並且使用 StdCall(默認)來調用該函數,那麼函數能夠執行,但函數參數不會從堆棧中刪除,這會導致堆棧被填滿。

CharSet

控制調用 A 變體還是調用 W 變體。

EntryPoint

此屬性用於設置封送拆收器在 DLL 中查找的名稱。設置此屬性後,您可以將 C# 函數重新命名為任何名稱。

ExactSpelling

將此屬性設置為 true,封送拆收器將關閉 A 和 W 的查找特性。

PreserveSig

COM 互操作使得具有最終輸出參數的函數看起來是由它返回的該值。此屬性用於關閉這一特性。

SetLastError

確保調用 Win32 API SetLastError(),以便您找出發生的錯誤。

StructLayout

LayoutKind

結構在默認情況下按順序布局,並且在多數情況下都適用。如果需要完全控制結構成員所放置的位置,可以使用 LayoutKind.Explicit,然後為每個結構成員添加 FIEldOffset 屬性。當您需要創建 union 時,通常需要這樣做。

CharSet

控制 ByValTStr 成員的默認字符類型。

Pack

設置結構的壓縮大小。它控制結構的排列方式。如果 C 結構采用了其他壓縮方式,您可能需要設置此屬性。

Size

設置結構大小。不常用;但是如果需要在結構末尾分配額外的空間,則可能會用到此屬性。

從不同位置加載

您無法指定希望 DLLImport 在運行時從何處查找文件,但是可以利用一個技巧來達到這一目的。
 DllImport 調用 LoadLibrary() 來完成它的工作。如果進程中已經加載了特定的 DLL,那麼即使指定的加載路徑不同,LoadLibrary() 也會成功。

這意味著如果直接調用 LoadLibrary(),您就可以從任何位置加載 DLL,然後 DllImport LoadLibrary() 將使用該 DLL。

由於這種行為,我們可以提前調用 LoadLibrary(),從而將您的調用指向其他 DLL。如果您在編寫庫,可以通過調用 GetModuleHandle() 來防止出現這種情況,以確保在首次調用 P/Invoke 之前沒有加載該庫。

P/Invoke 疑難解答

如果您的 P/Invoke 調用失敗,通常是因為某些類型的定義不正確。以下是幾個常見問題:

1.long != long。在 C++ 中,long 是 4 字節的整數,但在 C# 中,它是 8 字節的整數。

2.字符串類型設置不正確。

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