国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

C#中調用API

2024-07-21 02:22:16
字體:
來源:轉載
供稿:網友

介紹

  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 );

       }

   }

  }

}
 

轉自http://www.texiao.net
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 遂昌县| 江达县| 东丽区| 建湖县| 常山县| 修文县| 遂平县| 涪陵区| 岳西县| 怀化市| 兴义市| 大名县| 丹东市| 达州市| 隆德县| 雅安市| 高安市| 池州市| 顺义区| 秦安县| 贞丰县| 沛县| 额敏县| 若羌县| 滨州市| 靖远县| 湘潭市| 邵阳市| 加查县| 贵港市| 都匀市| 道孚县| 光泽县| 达拉特旗| 政和县| 志丹县| 竹溪县| 保康县| 清流县| 江阴市| 海门市|