API函數快速入門--API函數簡介

作爲一個編程初學者來說,API函數也許是一個時常耳聞卻感覺有些神祕的東西。單看它的複雜語法,就足令人望而生畏,但是任何事物在我們深入瞭解它之前,總是會有這種感覺的。我們這篇API入門教程的目的,就是要把API函數的來龍去脈告訴大家,破除對API函數的畏懼,使它成爲我們編程的好助手。

  大家可能在許多書上看到過API的英文全稱(Application Programming Interface),WIN32 API也就是MicrosoftWindows 32位平臺的應用程序編程接口。對這個定義的理解,需要追溯到操作系統的發展歷史上,當WINDOWS操作系統開始佔據主導地位的時候,開發WINDOWS平臺下的應用程序成爲人們的需要。而在WINDOWS程序設計領域處於發展的初期,WINDOWS程序員所能使用的編程工具唯有API函數,這些函數是WINDOWS提供給應用程序與操作系統的接口,他們猶如“積木塊”一樣,可以搭建出各種界面豐富,功能靈活的應用程序。所以可以認爲API函數是構築整個WINDOWS框架的基石,在它的下面是WINDOWS的操作系統核心,而它的上面則是所有的華麗的WINDOWS應用程序。(配圖1)

配圖一  控件和類庫

  但是,那時的WINDOWS程序開發還是比較複雜的工作,程序員必須熟記一大堆常用的API函數,而且還得對WINDOWS操作系統有深入的瞭解。然而隨着軟件技術的不斷髮展,在WINDOWS平臺上出現了很多優秀的可視化編程環境,程序員可以採用“即見即所得”的編程方式來開發具有精美用戶界面和功能強大的應用程序。

  這些優秀可視化編程環境操作簡單、界面友好(諸如VB、VC++、DELPHI等),在這些工具中提供了大量的類庫和各種控件,它們替代了API的神祕功能,事實上這些類庫和控件都是構架在WIN32 API函數基礎之上的,是封裝了的API函數的集合。它們把常用的API函數的組合在一起成爲一個控件或類庫,並賦予其方便的使用方法,所以極大的加速了WINDOWS應用程序開發的過程。有了這些控件和類庫,程序員便可以把主要精力放在程序整體功能的設計上,而不必過於關注技術細節。

  實際上如果我們要開發出更靈活、更實用、更具效率的應用程序,必然要涉及到直接使用API函數,雖然類庫和控件使應用程序的開發簡單的多,但它們只提供WINDOWS的一般功能,對於比較複雜和特殊的功能來說,使用類庫和控件是非常難以實現的,這時就需要採用API函數來實現。

  這也是API函數使用的場合,所以我們對待API函數不必刻來研究每一個函數的用法,那也是不現實的(能用的到的API函數有幾千個呢)。正如某位大蝦所說:API不要去學,在需要的時候去查API幫助就足夠了。

 一、在VB中聲明API函數有兩種方法:如果我們只在某個窗體中使用API函數,我們可以在窗體代碼的General部分聲明它:

  聲明的語法是:
  Private Declare Function ...
  Private Declare Sub.....
  這裏必須採用Private聲明,因爲這個API函數只能被一個窗體內的程序所調用。

添加模塊  如果我們的程序有多個窗體構成,而且我們需要在多個窗體中使用同一個API函數,就需要在模塊中聲明瞭。
  先添加一個模塊(如圖示),
  然後採用如下語法聲明:
  Public Declare Function....
  Public Declare Sub....
  
Public聲明的含義是把API函數作爲一個公共函數或過程,在一個工程中的任何位置(包括所有的窗體和模塊)都能直接調用它。 聲明完畢我們就能在程序中使用此API函數了。

  二、可採用以下幾種方式使用API函數,以SetWindowPos函數爲例:
  (1)忽略函數返回值的調用:
    SetWindowPos Form1.hWnd, -2 ,0 ,0 ,0, 0, 3
  注意此時函數的參數是不加括號的。
  (2)Call方法調用:
    Call SetWindowPos(Form1.hWnd, -2, 0, 0, 0, 3)
  注意這裏需要加上括號,但我們不取回函數的返回值。
  (3)取得函數返回值的調用:
    MyLng = SetWindowPos(Form1.hWnd, -2, 0, 0, 0, 3)
  此時需要加上括號,而且我們必須事先定義一個變量(變量的類型與函數返回值類型相同)來存儲API函數的返回值。

  三、幾個問題的說明:

  (1)聲明中的Lib 和 Alias 是怎麼回事
  一般情況下WIN32API函數總是包含在WINDOWS系統自帶的或是其它公司提供的動態連接庫DLL中,而Declare語句中的Lib關鍵字就用來指定DLL(動態連接庫)文件的路徑,這樣VB才能找到這個DLL文件,然後才能使用其中的API函數。如果我們只是列出DLL文件名而不指出其完整的路徑的話,VB會自動到.EXE文件所在目錄、當前工作目錄、WINDOWS/SYSTEM目錄、WINDOWS目錄下搜尋這個DLL文件。所以如果所要使用DLL文件不在上述幾個目錄下的話,我們應該指明其完整路徑。
  Alias用於指定API函數的別名,如果我們調用的API函數要使用字符串(參數中包含String型)的話,Alias關鍵字是必須的。這是因爲在ANSI和Unicode字符集中同一API函數的名稱可能是不一樣的,爲了保證不出現聲明錯誤,我們使用Alias關鍵字指出API函數的別名,一般來說在WIN9X平臺下我們把API函數名後加一個大寫A作爲別名即可。

  (2)常見的API參數類型的說明
  API函數的參數中最常見的是長整Long型數據類型,例如API中的句柄、一些特定的常量、函數的返回值都是此類型 的值;另外幾種常見的參數類型有:整型Integer、Byte型、String型等。

  (3)聲明中的ByVal是作什麼用的
  這跟VB的參數傳遞方式有關,在默認情況下VB是通過地址傳遞方式傳遞函數的參數、而有些API函數要求必須採用傳值方式來傳遞函數參數(這兩種參數傳遞方式是不同的,前者傳遞的是一個指針,而後者要求是參數真實的值)。這樣就會發生錯誤,解決的辦法是在API函數參數聲明的前面加上ByVal關鍵字,這樣VB就採用傳值方式傳遞參數了。

  (4)怎樣得到完整的API函數聲明
  VB自帶了API文本查看器API TEXT VIEWER,我們可以在其中找到API函數的完整聲明,然後把它粘貼到程序中即可。

實際上,在DELPHI中調用WIN32 API函數與在C或C++中調用WIN32 API函數沒有大的區別。DELPHI中將C或C++中引用 的WINDOWS.H頭文件改寫爲WINDOWS.PAS單元,使WINDOWS API函數的定義符合PASCAL語法。而其他的頭文件在DELPHI中也都有相應的.PAS單元一一對應,所以在DELPHI中調用API函數時,只須將相應的API函數單元加入到USES語句的單元之中,便可直接調用相應的函數了。

  下面我們來看一個簡單的例子,程序的作用是改變桌面牆紙:

  unit Unit1;
  interface
  {Windows.PAS是DELPHI提供的標準單元,我們要調用API函數,需要引用這個單元}
  uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
  type
    TForm1 = class(TForm);
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    private { Private declarations }
    public { Public declarations }
  end;
  var Form1: TForm1;        
  implementation {$R *.DFM}
  procedure TForm1.Button1Click(Sender: TObject);
  var filename1:string;
  begin
    filename1:='c:/windows/mywallpaper.bmp';
    {調用API函數SystemParametersInfo來設置桌面牆紙的圖片文件爲'c:/windows/mywallpaper.bmp'}
    SystemParametersInfo(SPI_SETDESKWALLPAPER, 0,pchar(filename1), SPIF_UPDATEINIFILE);
  end;
  end.

  其中SystemParametersInfo函數的參數的意義如下表:

參數: 意義
uAction Longint,指定要設置的參數。參考uAction常數表
uParam Longint,參考uAction常數表
lpvParam 不定,按引用調用的Integer、Longint和數據結構。
fuWinIni 參數規定了在設置系統參數的時候,是否應更新用戶設置參數
常數SPIF_UPDATEINIFILE表示更新

  下面是本例的uAction常數,和使用它的方法:

參數
意義和使用方法
SPI_SETDESKWALLPAPER
設置桌面背景牆紙,用法爲:
SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, 圖片路徑, 1)

  好了在DELPHI中調用API函數就是這樣簡單,我們需要知道的只是API函數的意義和參數列表,然後把它用到程序中就可以了。需要提醒的是C的數據類型可能會與DELPHI的數據類型有些不同,而調用API函數時必須保證類型一致才行,這是我們必須注意的一點。

今天我們把標準WIN32 API函數分類介紹一下,雖然我們不必去刻意研究每個API函數的用法,但是在需要的時候,至少應該知道它屬於哪一類的API函數,這樣才能正確查找和使用。

  按照通常的劃分標準,WIN32 API函數分爲七大類:

  1、窗口管理類:這類API函數嚮應用程序提供了一些創建和管理用戶界面的方法,我們可以使用它們來做出程序的界面。
  2、窗口通用控制類:系統SHELL提供了一些控制,使用這些控制可以使窗口具有與衆不同的外觀,通用控制是由通用控制庫COMCTL32.DLL提供的。
  3、SHELL特性類:應用程序可以使用它們來增強系統SHELL各方面的功能。
  4、圖形設備接口(GDI):提供繪圖、圖形處理、使用顯示設備等一系列的API函數。
  5、系統服務類:爲計算機提供了訪問計算機資源以及底層操作的手段。
  6、國際特性類:有助於我們編寫國際化的應用程序,提供Unicode字符集和多語種支持。
  7、網絡服務類:允許網絡上的不同計算機之間的不同應用程序之間進行通訊,用於在各計算機上創建和管理共享資源的連接。

  上面的分類對於我們來說還是顯得寬泛了一些,所以本節以後的各節會採用小分類的方法,也就是按具體功能的劃分爲大家介紹一些常用的API函數的用法。

發佈了28 篇原創文章 · 獲贊 0 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章