成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C#調用Windows API函數

開發 后端
本文介紹C#調用Windows API函數,以及介紹Visual C#和其它開發工具一樣也能夠調用動態鏈接庫的API函數。

Api函數是構筑Windws應用程序的基石,每一種Windows應用程序開發工具,它提供的底層函數都間接或直接地C#調用Windows API函數,同時為了實現功能擴展,一般也都提供了C#調用Windows API函數的接口, 也就是說具備調用動態連接庫的能力。Visual C#和其它開發工具一樣也能夠調用動態鏈接庫的API函數。.NET框架本身提供了這樣一種服務,允許受管轄的代碼調用動態鏈接庫中實現的非受管轄函數,包括操作系統提供的Windows API函數。它能夠定位和調用輸出函數,根據需要,組織其各個參數(整型、字符串類型、數組、和結構等等)跨越互操作邊界。

下面以C#為例簡單介紹調用API的基本過程: 
動態鏈接庫函數的聲明 

動態鏈接庫函數使用前必須聲明,相對于VB,C#函數聲明顯得更加羅嗦,前者通過 Api Viewer粘貼以后,可以直接使用,而后者則需要對參數作些額外的變化工作。

動態鏈接庫函數聲明部分一般由下列兩部分組成,一是函數名或索引號,二是動態鏈接庫的文件名。 
譬如,你想調用User32.DLL中的MessageBox函數,我們必須指明函數的名字MessageBoxA或MessageBoxW,以及庫名字 User32.dll,我們知道Win32 API對每一個涉及字符串和字符的函數一般都存在兩個版本,單字節字符的ANSI版本和雙字節字符的UNICODE版本。

下面是一個調用API函數的例子:

  1. [DllImport("KERNEL32.DLL", EntryPoint="MoveFileW"SetLastError=true,    
  2. CharSetCharSet=CharSet.Unicode, ExactSpelling=true,    
  3. CallingConventionCallingConvention=CallingConvention.StdCall)]    
  4. public static extern bool MoveFile(String src, String dst);   

其中入口點EntryPoint標識函數在動態鏈接庫的入口位置,在一個受管轄的工程中,目標函數的原始名字和序號入口點不僅標識一個跨越互操作界限的函數。而且,你還可以把這個入口點映射為一個不同的名字,也就是對函數進行重命名。重命名可以給調用函數帶來種種便利,通過重命名,一方面我們不用為函數的大小寫傷透腦筋,同時它也可以保證與已有的命名規則保持一致,允許帶有不同參數類型的函數共存,更重要的是它簡化了對ANSI和Unicode版本的調用。CharSet用于標識函數調用所采用的是Unicode或是ANSI版本,ExactSpelling=false將告訴編譯器,讓編譯器決定使用 Unicode或者是Ansi版本。其它的參數請參考MSDN在線幫助.

在C#中,你可以在EntryPoint域通過名字和序號聲明一個動態鏈接庫函數,如果在方法定義中使用的函數名與DLL入口點相同,你不需要在EntryPoint域顯示聲明函數。否則,你必須使用下列屬性格式指示一個名字和序號。

[DllImport("dllname", EntryPoint="Functionname")] 
[DllImport("dllname", EntryPoint="#123")] 
值得注意的是,你必須在數字序號前加“#” 
下面是一個用MsgBox替換MessageBox名字的例子:

  1. using System.Runtime.InteropServices;    
  2.  
  3. public class Win32 {    
  4. [DllImport("user32.dll", EntryPoint="MessageBox")]    
  5. public static extern int MsgBox(int hWnd, String text, String caption, uint type);    
  6. }   

許多受管轄的動態鏈接庫函數期望你能夠傳遞一個復雜的參數類型給函數,譬如一個用戶定義的結構類型成員或者受管轄代碼定義的一個類成員,這時你必須提供額外的信息格式化這個類型,以保持參數原有的布局和對齊。

C#提供了一個StructLayoutAttribute類,通過它你可以定義自己的格式化類型,在受管轄代碼中,格式化類型是一個用StructLayoutAttribute說明的結構或類成員,通過它能夠保證其內部成員預期的布局信息。布局的選項共有三種:

布局選項 
描述 
◆LayoutKind.Automatic 
為了提高效率允許運行態對類型成員重新排序。 
注意:永遠不要使用這個選項來調用不受管轄的動態鏈接庫函數。 
◆LayoutKind.Explicit 
對每個域按照FieldOffset屬性對類型成員排序 
◆LayoutKind.Sequential 
對出現在受管轄類型定義地方的不受管轄內存中的類型成員進行排序。 

傳遞結構成員 

下面的例子說明如何在受管轄代碼中定義一個點和矩形類型,并作為一個參數傳遞給User32.dll庫中的PtInRect函數, 
函數的不受管轄原型聲明如下: 
BOOL PtInRect(const RECT *lprc, POINT pt); 
注意你必須通過引用傳遞Rect結構參數,因為函數需要一個Rect的結構指針。

  1. using System.Runtime.InteropServices;    
  2.  
  3. [StructLayout(LayoutKind.Sequential)]    
  4. public struct Point {    
  5. public int x;    
  6. public int y;    
  7. }    
  8.  
  9. [StructLayout(LayoutKind.Explicit]    
  10. public struct Rect {    
  11. [FieldOffset(0)] public int left;    
  12. [FieldOffset(4)] public int top;    
  13. [FieldOffset(8)] public int right;    
  14. [FieldOffset(12)] public int bottom;    
  15. }    
  16.  
  17. class Win32API {    
  18. [DllImport("User32.dll")]    
  19. public static extern Bool PtInRect(ref Rect r, Point p);    
  20. }    
  21. 類似你可以調用GetSystemInfo函數獲得系統信息:    
  22. ? using System.Runtime.InteropServices;    
  23. [StructLayout(LayoutKind.Sequential)]    
  24. public struct SYSTEM_INFO {    
  25. public uint dwOemId;    
  26. public uint dwPageSize;    
  27. public uint lpMinimumApplicationAddress;    
  28. public uint lpMaximumApplicationAddress;    
  29. public uint dwActiveProcessorMask;    
  30. public uint dwNumberOfProcessors;    
  31. public uint dwProcessorType;    
  32. public uint dwAllocationGranularity;    
  33. public uint dwProcessorLevel;    
  34. public uint dwProcessorRevision;    
  35. }    
  36. [DllImport("kernel32")]    
  37. static extern void GetSystemInfo(ref SYSTEM_INFO pSI);    
  38.  
  39. SYSTEM_INFO pSI = new SYSTEM_INFO();    
  40. GetSystemInfo(ref pSI);   

在C#調用Windows API函數時,大部分函數采用指針傳遞參數,對一個結構變量指針,我們除了使用上面的類和結構方法傳遞參數之外,我們有時還可以采用數組傳遞參數。 

【編輯推薦】

  1. 淺談C#中構造函數和成員函數
  2. C#函數的參數返回結構數組
  3. 概述ASP.NET中的NGWS Runtime
  4. C#函數與JavaScript函數
  5. 詳解C# Object.Equals函數
責任編輯:佚名 來源: IT168
相關推薦

2009-07-31 16:12:10

Windows APIC#

2009-08-17 13:18:01

C#調用Windows

2009-08-25 16:16:27

C#調用Windows

2009-08-17 13:49:20

C#中調用Window

2009-08-17 13:26:20

C#調用Windows

2009-08-07 16:10:20

C#調用API

2009-08-05 15:10:19

C#調用GoogleE

2009-08-03 13:13:52

C#調用Outlook

2009-08-07 16:43:44

C#調用Windows

2009-08-03 14:09:15

C#調用API

2009-08-21 17:42:36

C#調用API

2009-08-25 10:59:00

C#調用函數顯示值

2009-08-07 17:22:36

C#調用dll導出函數

2009-08-14 09:15:28

C#調用構造函數

2009-08-20 10:34:46

C#中聲明API函數

2009-07-31 15:47:20

Win32 APIC#

2009-08-05 09:40:02

C#調用DLL函數

2009-08-05 09:30:39

C#調用DLL函數

2009-08-28 15:45:32

C#操作Win32 A

2009-08-11 14:16:00

Winform調用WEC#
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 看一级毛片视频 | 操久久| 毛片com| 亚洲欧美久久 | 久久久久久www | 欧美一区二 | 男人久久天堂 | 四虎精品在线 | 涩涩视频在线观看 | 黄色片网站在线观看 | 一级片成人 | 伦理午夜电影免费观看 | 欧美一级久久 | 精品一区二区av | 精品国产99 | 日韩高清一区二区 | 久久久国产一区二区三区 | 久草资源在线 | 在线一区视频 | 91久久久久 | 亚洲精品久久久一区二区三区 | 国产精品国产a级 | 国产精品成人av | 五月婷婷激情网 | 国产一级一级国产 | 91在线观看 | 夜夜骑首页| 国产精品日韩欧美一区二区三区 | 国产日韩一区二区三区 | 欧美激情国产日韩精品一区18 | 日本色高清 | 中文字幕成人av | 2021狠狠干 | 国产亚洲高清视频 | 欧美在线一区二区三区 | 中文字幕 在线观看 | 亚洲最大的黄色网址 | 国产精品成人久久久久 | 亚洲国产成人精品女人 | 亚洲视频一区在线观看 | 美女在线视频一区二区三区 |