發表文章

目前顯示的是 2002的文章

COM與多型的介面(使用Delphi)

圖片
//作者: 酷小毅 (酷小毅的程式試鍊場) //2002/05/03 於永和 COM與多型的介面 1.為何談介面的多型 到現在相信大家對於物件導向OOP的觀念都非常清楚了,而這裡我要在一次強調的是關於 COM 對於物件導向的支援以及觀念與傳統的物件導向有些不同,在前面筆者提過傳統 Class 的實作繼承中 SubClass 會 Reference 到 SuperClass 上所必須參考到的資訊,而這些資訊如果修改的話勢必影響的是所有的子類別,這是非常嚴重的,在近代的 OOP 觀念中強調介面與實作分開,介面與實作分開的好處這裡就不在重複,有興趣的請參考筆者的 Delphi COM/DCOM 分散式多層應用文章。我們知道 COM 的介面是可以繼承的,不過要注意的是 COM 並沒有完全的支援繼承,也就是說介面的繼承並不會繼承該介面後端的實作部分,也就是其行為模式,不過父物件 (SuperClass, 這裡也做父系的COM Object) 可以用本身的 Reference 和型別相容的 SubClass 溝通,這也就是我們今天要討論的重點。 圖(一). SuperClass可以和跟他型別相容的SubClass (CApp1, CApp2等)溝通,因為他們都是和CPAutoInterface型別相容的。   2.透過(介面)的實作繼承來達到介面多型 我們今天要探討的是延伸於COM當中的OOP的多型觀念,目前為止相信大家已經了解實作繼承如何影響及重複使用類別當中的方法及實作,這對減少重複性程式碼不僅有高度的Reuse特性也提供了更高的維護性,而多型就是由OOP的實作繼承所演伸出的一個特色,這可以說是物件導向當中最重要的觀念了,我們知道COM強調介面與實作分開,我們可以在一些SubClass繼承某個介面來達到介面的多型 (關於傳統物件導向的多型與COM的多型之差異性有興趣可參考筆者的"Delphi如何實作繼承一個介面"文章,這裡不在重複說明) ,這若應用在 IDispatch 介面所支援的 Automation 技術上即則可達到跨行程呼叫不同應用程式的目的 (這我會在下面第4個章節說明) ,但介面繼承它不像傳統的實作繼承可以直接延伸存取SuperClass的細節部分及存取SuperClass的屬性與方法,看起來

如何實作繼承一個COM介面(Delphi)

圖片
//酷小毅的Delphi試鍊場 //作者: 酷小毅 //2002/03/24 於永和 如何實作繼承一個介面 (1).為何談介面的實作繼承 相信現在大家都有清楚的物件導向觀念,在物件導向中我們可以透過繼承來達到讓所封裝的類別資料有高度的Reuse特性,在COM當中則強調將介面與實作分開,這現在已可說是現在物件導向的先驅了,我們知道傳統物件導向對於繼承對SuperClass所產生的相依性不會出現在COM的世界中,而且COM對於封裝做的非常的徹底,COM的Client可說都是以介面在操作,今天筆者將介紹如何在Delphi中實作繼承別人的介面,也許是其他的ActiveX DLL or ActiveX Exe檔案,實作繼承的目的在於繼承該介面原始的行為模式,公開的介面產生它就是一個以OLE Automation技術為基礎的OLE Server,如同MS Word and Excel等等,Automation技術指的實際上就是實作IDispatch的COM物件,實作IDispatch介面又稱為雙介面(Dual Interface),目前你眼睛所看的見的Com Object 或ActiveX元件DLL, OCX等都屬於Dual Interface的物件了. 實作繼承使我們的OLE Server提供相同的介面給外界使用,那當然第一步要有原始介面囉,我們 先建立一個ActiveX Library, 接著建立一個COM Object,接著Delphi會先請你為這個CoClass取個名子,筆者取名InterfaceTest,接著我們就可在Delphi提供的TypeLibrary編輯器建立如下的Method... 整個COM Object會提供一個對外的Method,這個Method只是一個空的沒有任何程式碼的Method,因為我們將在ImplementClient的程式中去Implement它,這個空的COM Object Unit1程式碼如下所示 : //Com Object程式碼如下 unit Unit1; interface uses Windows, ActiveX, Classes, ComObj, PrjInterfaceTest_TLB, StdVcl;

Win32程式設計技術

圖片
//2002/2/21 酷小毅於永和 (1).Win32的記憶體管理 各位若有經過Win31時代,玩過Win31也就是Win16的應用程式應該會發現,在win16下的應用程式共用相同的記憶體位址空間,在Win31下所有被執行的應用程式(Process)他們會存取到一塊由Windows所提供的一塊記憶體空間,也就是說應用程式可能會不小心存取到被其他應用程式所使用的記憶體位址,嚴重時甚至造成系統死當.而在Win32下Windows會載入一種稱為保護模式(不是win9x當機時進去的保護模式),在這個模式下會由Windows來掌控所有的 應用程式 Process, Thread,所有的應用程式訊息,使用者所產生的訊息包括鍵盤滑鼠等訊息,都必須透過Windows來達成,包括應用程式之間要存取另一個應用程式的資料或存取CMOS/BIOS資訊都必須透過Windows來達成,所以Windows當然回提供一系列windows的介面來完成這些事,這個介面就是Win32 API(Application Programming Inteerface). (2).Event driven事件驅動概念 Windows是一個充滿訊息的環境,在Windows下不斷的都有訊息流動,有時是Windows的訊息有時為System的訊息,有時是User的訊息,給應用程式的訊息經由應用程式轉換成事件,在交由應用程式相對應的事件處理常式來處裡該事件,有些則可能是某應用程式Send給其他應用程式的訊息,有些是使用者透過鍵盤滑鼠所產生的訊息,若將訊息分類則可分為:(1)Windows message (2) Application message. (3)User message.等,不過若對應用程式而言訊息就是訊息沒什麼不同,應用程式通常會有如下的一個while迴圈來接收並指派訊息給對應的處裡常式處裡 while(GetMessage(&Msg, null, null, null)) {     TranslateMessage(&Msg);     DispatchMessage(&Msg); }  在Windows下每一個視窗裡都會有處裡這些訊息的處裡函式來處裡執行相對應的動作,Windows的程式設計師就是要負責來完成這些動作的程式碼,判斷訊息種類在加已處裡

從OLE到COM、Automation、ActiveX技術

圖片
//2002/2/3 //酷小毅 一、 COM 基本概論 1. 什麼是COM(Component Object Model). COM,在幾年前幾乎就已經微軟對於所開發軟體使用的一種標準,COM的前身其實就是微軟在1993年推出的OLE2,OLE(Object Linking and Embeded)物件的連結與崁入,為早期一種復合式文件技術,能單一的文件(也可說是物件)內崁連結另一份文件的技術,這已經是一種物件間連結溝通的一種協定的技術,當時有人稱為OLE Control,ActiveX,因為增早期對這些名詞的制定過於寬鬆,加上許多人很難區分出什麼是OLE什麼是ActiveX,其實它們指的都是以COM為基礎的技術。 COM是建構軟體的一種標準,在Win32下是行程與行程間溝通的一種基準,一種協定,COM是一種以物件導向(OOP)為基礎,是一個以二進位重複使用(Binary Reuse)為基礎的架構,這意味著COM不但發揮OOP的長處,二進位重複使用使COM並不需要任何原始程式碼就可重複使用,所以只要是支援COM的程式它們只要了解介面即可相互溝通不需寮解對方的實作以及使用何種程式語言。 2. COM 以介面為基礎的設計方式 以介面為基礎的程式設計方式可說是COM的精神,此部份觀念相當重要,觀念了解了在談如何充分發揮以介面為基礎程式設計的好處。   介面的構成(TypeLibrary) TypeLib為COM定義介面(Interface)一種二進位構成檔,TypeLib中定義了此COM物件中的Class(CoClass),方法(Method)及屬性(Property),TypeLib可為單獨的一個檔案(可能是.OLB或.TLB,.OLB檔案則為.TLB的前身,為早期的COM物件),也可能和.OCX或.DLL或.EXE Bind在一起。   IDL(Interface Definition Lenguage) 簡介 一個COM的Client在RunTime時連結到一個Object,但是它再編譯時還是得要告訴他COM Server提供給他什麼樣的方法屬性等,那COM當然要提供一個描述COM Interface及CoClass的一種標準,因介面是要被公開的,當然那就是IDL語言,既然COM就是要達到語言的獨立性,表示不