程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi背後---初學者參考之二(2)

Delphi背後---初學者參考之二(2)

編輯:Delphi

(續Delphi背後---初學者參考之二(1) )

2 Windows API

API(Application Programming Interface)應用編程接口,所有的計算機語言都要用到它。API是什麼?API是程序使用操作系統提供的服務的一個途徑,我們大多數的編程都不直接操作硬件,而是調用這些API,再由操作系統直接操作硬件,這樣的好處是我們編程時不必考濾與硬件兼容的問題,更重要的是從操作系統層實現了代碼共享。所以,在編程時如果能用API實現的功能,我們盡量用它。

l         Delphi如何使用Windows API<?XML:namespace prefix = o ns = "urn:schemas-microsoft-com:office:Office" />

在日常開發工作中,我們經常要使用Windows API函數,那麼API函存在在哪裡呢?我們可以這樣理解,API函數就是封裝在Windows系統提供的DLL系統文件中。如我們經常使用的Beep過程(響鈴),就是調用Windwos系統目錄下的user32.dll中的MessageBeep實現的;SendMessage(發消息)就是直接調用user32.dll的SendMessageA。Delphi使用頻率最多的Dll是:advapi32.dll、kernel32.dll、mpr.dll、version.dll、comctl32.dll、gdi32.dll、opengl32.dll、user32.dll、wintrust.dll、msimg32.dll。

那麼Delphi是如何使用這API函數的呢?既然API函數存在於系統的DLL中,那麼我們就可以像調用自己寫的DLL一樣調用API函數啦。調用DLL函數有兩種方式,一種是靜態方式,一種是動態方式。調用Windows的API都是采用靜態方式,為什麼呢?這是因為這些DLL是操作系統提供的最基本服務,操作系統在啟動時就已經加載到內存中了,並且操作系統也大量的使用他們。

 

l         API與日常編程

Delphi封裝了Windows的大部分API函數(主要在Windows.pas單元中),應該說可以完成我們的大部分工作,我們一般不直接調用API函數。但有時有特別要求時,我們可能就要調用一些Delphi沒封裝過的API,有時甚至會調用Windows沒公布的API函數。那麼如何調用這些API函數呢?就像前面說的,使用靜態方法調用就好了。更詳細的調用請參看相關的資料。

調用這些Delphi沒封裝的API函數關鍵是要知道參數。可以查閱看最新的MSDN或相關的資料。

l         API與VCL

Microsoft的MFC大量的封裝地Windows API,VCL也不例外。VCL功能的實現大部分都離不開Windows API,要麼是直接調用,要麼是經過簡單的封裝再調用。如TControl的Repaint的實現(Control單元中):

procedure TControl.Repaint;

var

  DC: HDC;

begin

  if (Visible or (csDesigning in ComponentState) and not (

csNoDesignVisible in ControlStyle)) and (Parent <> nil) and

    Parent.HandleAllocated then

    if csOpaque in ControlStyle then

    begin

//直接調用user32.Dll的GetDC

      DC := GetDC(Parent.Handle);

      Try

        //直接調用gdi32.Dll的IntersectClipRect

        IntersectClipRect(DC, Left, Top, Left + Width, Top +

Height);

                // Parent.PaintControls調用大量的API

        Parent.PaintControls(DC, Self);

      Finally

// 直接調用user32.Dll的ReleaseDC

        ReleaseDC(Parent.Handle, DC);

      end;

    end else

    begin

      //以下兩個經過封裝調用

      Invalidate;

      Update;

    end;

end;

可見VCL中處處都有API,我們從另外一個面來理解VCL就是:VCL就是大量封裝API函數的類庫,這樣的結果就是使我們更容易使用API,不必關心那些煩人的API參數。

 

3 Delphi與Windwos COM服務

COM是什麼東西?COM(Component Object Model),組件對象模型,它是基於Windows平台的讓不同的獨立對象能相互通訊的不受任何計算語言約束的軟件組件模型,它定義一組API和一個二進制標准。這個定義比較抽象,首先它是一種組件模型,定義了一種組件對象規范,實現這個COM模型的對象就是COM對象。COM對象是通過接口(Interface)來實現訪問的,一個COM對象可以包含一個或多個接口,這些接口構成了COM對象的功能,你可以像訪問VCL對象方法一樣訪問COM對象的接口方法。COM對象的目的是實現資源共享,它在二進制代碼級別實現了共享,所以它可以用不同的編程語言來實現,也可以由不同的編程語言來調用,這類似於DLL(其實COM的思想來源來DLL)。

l         VCL與COM

COM是Microsoft以前極力推崇的東西,所以在Windows操作系統中無處不在,同樣Delphi的VCL也有調用Windows COM服務的,最明顯例子就是組件欄ADO頁的所有ADO組件,如TADOQuery,它是從TCustomADODataSet繼承下來的,而TCustomADODataSet的定義如下:

TCustomADODataSet = class(TDataSet, IUnknown,

RecordsetEventsVt)

  private

    FRecordsetObject: _Recordset;

    FFindCursor: _Recordset;

    FLookupCursor: _Recordset;

    FLockCursor: _Recordset;

    FRowset: IRowset;

    FAccessor: IAccessor;

    FRowsetFind: IRowsetFind;

    FHAccessor: HAccessOR;

    FOleRecBufSize: Integer;

end;

ADO(Microsoft ActiveX Data Objects),它是一組通過Microsoft OLE DB 提供者訪問數據庫的COM對象的集合。如我們研究一下TADOQuery的First方法的實現過程:

TADOQuery.First->TDataSet.First->TdataSet.InternalFirst-> TCustomADODataSet. InternalFirst ->Recordset15. MoveFirst

TADOQuery從TCustomADODataSet繼承,而TCustomADODataSet從TdataSet繼承,TdataSet.InternalFirst定義的是虛方法,而子類TCustomADODataSet. InternalFirst覆蓋了它。TCustomADODataSet. InternalFirs調用接口Recordset15的 MoveFirst方法。

不難發現,TADOQuery.First最終是通過接口調用COM對象實現的。

 

l         Delphi與Windows 外殼

什麼是Windows外殼呢?Windows外殼是Windows界面操作的環境,它還為我們編程提供了強大的可擴展性。我們利用Windows外殼實現某些功能的編程,稱為外殼擴展。例如,如果你的機器上已經裝了WinRAR,在文件夾的右鍵菜單就會看到WinRAR的壓縮菜單。這些功能就是通過Windows的外殼擴展實現的。

Windows外殼是基於COM的,所以所有的外殼擴展都要通過接口實現。Delphi也定義了很多外殼擴展接口,在Delphi7的安裝目錄下的Source tlWinShlObj.pas單元中。

在Delphi的Demo目錄下的有一個Virtual ListvIEw的例子,就是通過Windows外殼擴展實現磁盤浏覽的,有興趣的讀者可以研究一下。

4 嵌入式匯編語言

在代碼中嵌入匯編語言也是Delphi的一大特色,如VCL的根類Tobjce的實現就大量嵌入了匯編語句。

  匯編語言是一種比較低級的計算機語言,與硬件的關系比較密切。所以我們在平時編程中盡量不要使用它,但是在某些特殊場合(如性能要求比較高、需要直接操縱硬件)下,使用它還是能發揮很大的作用的。

        

   

                                                              The end.

   

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