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

C#中調用API

編輯:關於C#

介紹

API(Application Programming Interface),我想大家不會陌生,它是我們Windows編程的常客,雖然基於.Net平台的C#有了強大的類庫,但是,我們還是不能否認API在Windows編程中的重要性。大多數的編程語言都支持API編程,而.Net平台中的MFC(Microsoft Foundation Class Library)構架本身就封裝了大部分的API。

做為程序員,我們需要了解API從字面上了解便是編程接口,因此,做為開發者,需要了解的只是API的使用方法。

API根據操作系統、處理器及功能性的不同而擁有很多不同的類型。   操作系統特用的API:

每種操作系統都有許多通用的API以及一些特用的API,這些特用的API只能在當前操作系統中執行。

例如:

Windows NT 支持 MS-DOS, Win16, Win32, POSIX (Portable Operating System Interface), OS/2 console API; 而 Windows 95 支持 MS-DOS, Win16 以及 Win32 APIs.

Win16 & Win32 API:

Win16是為十六位處理器開發的,早期的操作系統均支持。

Win32則是為32位處理器開發。它可移植性強,被大部分的處理器所支持。

Win32 API在庫名後有一個”32”後綴。比如KERNEL32,USER32等。

所有API在下面3個庫中得以運行:

  Kernel
  User
  GDI

1. KERNEL

他的庫名為 KERNEL32.DLL, 他主要用於產生與操作系統之間的關聯:

程序加載

上下文選擇.

文件輸入輸出.

內存管理.

例如: GlobalMemoryStatus 函數就包括當前物理內存及虛擬內存的使用信息。

2. USER

這個類庫在Win32中名叫 USER32.DLL。

它允許管理全部的用戶接口,比如:

窗口

菜單

對話框

圖標等.,

例如: DrawIcon 函數將在指定的設備關聯上“畫”出圖標或者鼠標。

3. GDI (Graphical Device Interface)

它在Win32中的庫名為:GDI32.dll,它是圖形輸出庫。使用GDI Windows“畫”出窗口、菜單以及對話框等:

它能創建圖形輸出.

它也能保存圖形文件.

例如: CreateBitmap 函數就能通過指定的長、寬、顏色創建一個位圖。

C# 中操作API:

作為初學者來說,在C#中使用API確是一件令人頭疼的問題。在使用API之間你必須知道如何在C#中使用結構、類型轉換、安全/不安全代碼,可控/不可控代碼等許多知識。

一切從簡單開始,復雜的大家一時不能接受。我們就從實現一個簡單的MessageBox開始。首先打開VS.Net ,創建一個新的C#工程,並添加一個Button按鈕。當這個按鈕被點擊,則顯示一個MessageBox對話框。

即然我們需要引用外來庫,所以必須導入一個Namespace:

  using System.Runtime.InteropServices;

接著添加下面的代碼來聲明一個API:

  [DllImport("User32.dll")]
  public static extern int MessageBox(int h, string m, string c, int type);

此處DllImport屬性被用來從不可控代碼中調用一方法。”User32.dll”則設定了類庫名。DllImport屬性指定dll的位置,這個dll中包括調用的外部方法。Static修飾符則聲明一個靜態元素,而這個元素屬於類型本身而不是上面指定的對象。extern則表示這個方法將在工程外部執行,使用DllImport導入的方法必須使用extern修飾符。

MessageBox 則是函數名,擁有4個參數,其返回值為數字。

大多數的API都能傳遞並返回值。

添中Click點擊事件代碼:

  protected void button1_Click(object sender, System.EventArgs e)
  {
      MessageBox (0,"API Message Box","API Demo",0);
  }

編譯並運行這個程序,當你點擊按鈕後,你將會看到對話框,這便是你使用的API函數。

使用結構體

操作帶有結構體的API比使用簡單的API要復雜的多。但是一旦你掌握了API的過程,那個整個API世界將在你的掌握之中。

下面的例子中我們將使用GetSystemInfo API 來獲取整個系統的信息。

第一步還是打開C#建立一個Form工程,同樣的添中一個Button按鈕,在代碼窗中輸入下面的代碼,導入Namespace:

  using System.Runtime.InteropServices;

聲明一個結構體,它將做為GetSystemInfo的一個參數:

  [StructLayout(LayoutKind.Sequential)]
  public struct SYSTEM_INFO {
      public uint dwOemId;
      public uint dwPageSize;
      public uint lpMinimumApplicationAddress;
      public uint lpMaximumApplicationAddress;
      public uint dwActiveProcessorMask;
      public uint dwNumberOfProcessors;
      public uint dwProcessorType;
      public uint dwAllocationGranularity;
      public uint dwProcessorLevel;
      public uint dwProcessorRevision;
  }

聲明API函數:

  [DllImport("kernel32")]
  static extern void GetSystemInfo(ref SYSTEM_INFO pSI);

添加下面的代碼至按鈕的點擊事件處理中:

首先創建一個SYSTEM_INFO結構體,並將其傳遞給GetSystemInfo函數。   protected void button1_Click (object sender, System.EventArgs e)
  {
      try
      {
          SYSTEM_INFO pSI = new SYSTEM_INFO();
          GetSystemInfo(ref pSI);
          //
          //
          //

一旦你接收到返回的結構體,那麼就可以以返回的參數來執行操作了。

  e.g.listBox1.InsertItem (0,pSI.dwActiveProcessorMask.ToString());:
          //
          //
          //
     }
     catch(Exception er)
     {
          MessageBox.Show (er.Message);
     }
  }

調用API全部代碼

  //Created By Ajit Mungale
  //程序補充 飛刀
  namespace UsingAPI
  {
  using System;
  using System.Drawing;
  using System.Collections;
  using System.ComponentModel;
  using System.WinForms;
  using System.Data;
  using System.Runtime.InteropServices;
  //Struct 收集系統信息
  [StructLayout(LayoutKind.Sequential)]
  public struct SYSTEM_INFO {
        public uint dwOemId;
        public uint dwPageSize;
        public uint lpMinimumApplicationAddress;
        public uint lpMaximumApplicationAddress;
        public uint dwActiveProcessorMask;
        public uint dwNumberOfProcessors;
        public uint dwProcessorType;
        public uint dwAllocationGranularity;
        public uint dwProcessorLevel;
        public uint dwProcessorRevision;
    }
  //struct 收集內存情況
  [StructLayout(LayoutKind.Sequential)]
  public struct MEMORYSTATUS
  {
       public uint dwLength;
       public uint dwMemoryLoad;
       public uint dwTotalPhys;
       public uint dwAvailPhys;
       public uint dwTotalPageFile;
       public uint dwAvailPageFile;
       public uint dwTotalVirtual;
       public uint dwAvailVirtual;
  }
  public class Form1 : System.WinForms.Form
  {
    private System.ComponentModel.Container components;
    private System.WinForms.MenuItem menuAbout;
    private System.WinForms.MainMenu mainMenu1;
    private System.WinForms.ListBox listBox1;
    private System.WinForms.Button button1;
  //獲取系統信息
    [DllImport("kernel32")]
    static extern void GetSystemInfo(ref SYSTEM_INFO pSI);
    //獲取內存信息
    [DllImport("kernel32")]
    static extern void GlobalMemoryStatus(ref MEMORYSTATUS buf);
    //處理器類型
    public const int PROCESSOR_INTEL_386 = 386;
    public const int PROCESSOR_INTEL_486 = 486;
    public const int PROCESSOR_INTEL_PENTIUM = 586;
    public const int PROCESSOR_MIPS_R4000 = 4000;
    public const int PROCESSOR_ALPHA_21064 = 21064;
    public Form1()
    {
      InitializeComponent();
    }
    public override void Dispose()
    {
      base.Dispose();
      components.Dispose();
    }
    private void InitializeComponent()
     {
       this.components = new System.ComponentModel.Container ();
       this.mainMenu1 = new System.WinForms.MainMenu ();
       this.button1 = new System.WinForms.Button ();
       this.listBox1 = new System.WinForms.ListBox ();
       this.menuAbout = new System.WinForms.MenuItem ();
       mainMenu1.MenuItems.All = new System.WinForms.MenuItem[1] {this.menuAbout};
       button1.Location = new System.Drawing.Point (148, 168);
       button1.Size = new System.Drawing.Size (112, 32);
       button1.TabIndex = 0;
       button1.Text = "&Get Info";
       button1.Click += new System.EventHandler (this.button1_Click);
       listBox1.Location = new System.Drawing.Point (20, 8);
       listBox1.Size = new System.Drawing.Size (368, 147);
       listBox1.TabIndex = 1;
       menuAbout.Text = "&About";
       menuAbout.Index = 0;
       menuAbout.Click += new System.EventHandler (this.menuAbout_Click);
       this.Text = "System Information - Using API";
       this.MaximizeBox = false;
       this.AutoScaleBaseSize = new System.Drawing.Size (5, 13);
       this.MinimizeBox = false;
       this.Menu = this.mainMenu1;
       this.ClientSize = new System.Drawing.Size (408, 213);
       this.Controls.Add (this.listBox1);
       this.Controls.Add (this.button1);
    }
    protected void menuAbout_Click (object sender, System.EventArgs e)
    {
       Form abt=new about() ;
       abt.ShowDialog();
    }
    protected void button1_Click (object sender, System.EventArgs e)
    {
       try
       {
          SYSTEM_INFO pSI = new SYSTEM_INFO();
          GetSystemInfo(ref pSI);
          string CPUType;
          switch (pSI.dwProcessorType)
          {
            case PROCESSOR_INTEL_386 :
               CPUType= "Intel 386";
               break;
            case PROCESSOR_INTEL_486 :
               CPUType = "Intel 486" ;
              break;
            case PROCESSOR_INTEL_PENTIUM :
              CPUType = "Intel Pentium";
              break;
            case PROCESSOR_MIPS_R4000 :
              CPUType = "MIPS R4000";
              break;
            case PROCESSOR_ALPHA_21064 :
              CPUType = "DEC Alpha 21064";
              break;
            default :
              CPUType = "(unknown)";
         }
         listBox1.InsertItem (0,"Active Processor Mask :"+pSI.dwActiveProcessorMask.ToString());
         listBox1.InsertItem (1,"Allocation Granularity :"+pSI.dwAllocationGranularity.ToString());
         listBox1.InsertItem (2,"Number Of Processors :"+pSI.dwNumberOfProcessors.ToString());
         listBox1.InsertItem (3,"OEM ID :"+pSI.dwOemId.ToString());
         listBox1.InsertItem (4,"Page Size:"+pSI.dwPageSize.ToString());
         listBox1.InsertItem (5,"Processor Level Value:"+pSI.dwProcessorLevel.ToString());
         listBox1.InsertItem (6,"Processor Revision:"+ pSI.dwProcessorRevision.ToString());
         listBox1.InsertItem (7,"CPU type:"+CPUType);
         listBox1.InsertItem (8,"Maximum Application Address: "+pSI.lpMaximumApplicationAddress.ToString());
         listBox1.InsertItem (9,"Minimum Application Address:" +pSI.lpMinimumApplicationAddress.ToString());
         /************** 從 GlobalMemoryStatus 獲取返回值****************/
         MEMORYSTATUS memSt = new MEMORYSTATUS ();
         GlobalMemoryStatus (ref memSt);
         listBox1.InsertItem(10,"Available Page File :"+ (memSt.dwAvailPageFile/1024).ToString ());
         listBox1.InsertItem(11,"Available Physical Memory : " + (memSt.dwAvailPhys/1024).ToString());
         listBox1.InsertItem(12,"Available Virtual Memory:" + (memSt.dwAvailVirtual/1024).ToString ());
         listBox1.InsertItem(13,"Size of structur :" + memSt.dwLength.ToString());
         listBox1.InsertItem(14,"Memory In Use :"+ memSt.dwMemoryLoad.ToString());
         listBox1.InsertItem(15,"Total Page Size :"+ (memSt.dwTotalPageFile/1024).ToString ());
         listBox1.InsertItem(16,"Total Physical Memory :" + (memSt.dwTotalPhys/1024).ToString());
         listBox1.InsertItem(17,"Total Virtual Memory :" + (memSt.dwTotalVirtual/1024).ToString ());
       }
       catch(Exception er)
       {
         MessageBox.Show (er.Message);
       }
    }
    public static void Main(string[] args)
    {
      try
       {
          Application.Run(new Form1());
       }
       catch(Exception er)
       {
          MessageBox.Show (er.Message );
       }
   }
  }
}

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