

Delphi中的COM應用
- 期刊名字:計算機時(shí)代
- 文件大?。?45kb
- 論文作者:雷孝平
- 作者單位:山東經(jīng)濟學(xué)院研究生部
- 更新時(shí)間:2020-06-12
- 下載次數:次
Computer Era No 10 2002Delph中的COM應用雷孝平(山東經(jīng)濟學(xué)院研究生部,山東濟南250014)摘要:COM技術(shù)并不特定于某種編程語(yǔ)言。本文以 Delphi為例,解釋了在 Delphi中COM的幾個(gè)基本要素是怎么實(shí)現的,并舉例說(shuō)明。關(guān)鍵字: Delphi;COM;接口;GUID;類(lèi)工廠(chǎng)COM( Component Object Model,組件對象模型)是生成的每個(gè)COM組件和接口,并向操作系統和其他軟件惟一Microsoft生成軟件組件的標準,可以將它比喻成一個(gè)規則簿,標識這個(gè)組件。對組件或接口進(jìn)行任何改變時(shí),就產(chǎn)生新的如果遵守COM規則,那么你的軟件能夠與其他組件交換信息,GUID。GUD是個(gè)128位整數現在還沒(méi)有一種編程語(yǔ)言能夠實(shí)現軟件組件在二進(jìn)制上的兼容性。通俗地說(shuō),COM提供了一支持128位的整數, Object Pascal中用一個(gè)叫TGUD的記錄種比較低層次的對象綁定機制,只提供對象間彼此通信的能來(lái)代表GUID,聲明如下:力。COM技術(shù)并不特定于某種編程語(yǔ)言,只要遵循同樣的接typ口,可以用C++、 Pascal、 Basic等不同語(yǔ)言實(shí)現。那么在 DelphiPGUID=中是怎么實(shí)現COM的呢?TGUID ED1: LongWord1 Delph中的接囗Delphi3開(kāi)始引入的 Interface關(guān)鍵字可以讓我們輕松聲D3: Word明COM接口。聲明接口非常類(lèi)似于聲明一個(gè)類(lèi)但接口只有屬D4: array[o.7] of Byte性和方法而沒(méi)有數據,而且接口并不實(shí)現自己,我們只能通過(guò)類(lèi)來(lái)實(shí)現接口,并通過(guò)創(chuàng )建實(shí)現接口的類(lèi)的對象來(lái)得到一個(gè)接由于以這種記錄方式為變量和常量賦GUID值非常麻煩,口的實(shí)例。接口的釋放也有特殊性:無(wú)論在接口上調用Fe或因此 Object Pascal允許用以下格式的字符串來(lái)表示TGUD者 Release方法都會(huì )引起非法訪(fǎng)問(wèn)!在 Delph中,釋放接口的正(xXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX確方法是將接口指針置為nl,這會(huì )自動(dòng)調用 Release的COM這樣,對 Delphi編譯器來(lái)說(shuō),下面兩種聲明是等效的:方法。而且, Delphi會(huì )自動(dòng)為我們跟蹤COM對象在它過(guò)期時(shí)Ny Guid: TGuid=(01:$12345678;D2:$1234;D3:$1234將它釋放所以我們不必關(guān)心COM對象的釋放問(wèn)題D4:($01,$02,$03,$04,$05,$06,$07,$08)所有的COM接口都是從 IUnknown接口繼承而來(lái)。 Delphi My Guid:Toud=123456781234-1234-12345678}中,Unknown的聲明如下:3類(lèi)工廠(chǎng)為了得到COM對象的實(shí)例,我們需要為此COM對象實(shí)現類(lèi)工廠(chǎng)。 Delphi中,類(lèi)工廠(chǎng)支持 IClassFactory接口,它的聲明r0oo0000o000o0c0o00000o0oo46yfunction Queryinterface(const lID: TGUID: out obj):Integer; stdcall;IClass Factory interface(IUnknown)function AddRef: Integer; stdcallr00o0001-0000000c000000000006yfunction Release: Integer; stdcallfunction Createinstance(const unkOuter: IUnknown; constid: TIID: out obj): HResult: stdcall;可以看到, IUnknown聲明了三個(gè)方法: QueryInterfaceO,function Lock Server(f Lock: BOOL): HResult; stdcaAddRefo和_ Released。因為 IUnknown是COM對象的基本接口,所以所有的接口都必須實(shí)現這三個(gè)方法,這可以用手工完注的田且劍建一個(gè)和類(lèi)工廠(chǎng)相關(guān)聯(lián)的成也可以讓vCL來(lái)代勞只要使類(lèi)從 TInterfaceObject繼承就coM中國煤化工以控制這個(gè)對象的接口的可以了。CNMHG口的指針。值得注意的是我們永遠不能通過(guò)接口來(lái)實(shí)現接口,只能通Delphi提供了兩個(gè)類(lèi)來(lái)封裝COM對象和類(lèi)工廠(chǎng):TCo過(guò)類(lèi)來(lái)實(shí)現。mobject和 TComObjectFactory。 TComObject包含了對Un2 GUIDkown和 TComObject創(chuàng )建的實(shí)例的支持; TComObjectFactory萬(wàn)方數捨 nique identifier,全局惟一標識符被賦予支持 Class Factory接口,并能夠創(chuàng )建 TComObject類(lèi)的實(shí)例。GUID(Globally計算機時(shí)代2002年第10期4一個(gè)COM的具體例子begin當實(shí)現一個(gè)COM應用時(shí),應該提供以下內容:Len : MAX COMPUTERNAME LENGTH 1cOM接口:暴露給客戶(hù)的服務(wù)接口,以便客戶(hù)知道GetMem(S, Len)COM對象都提供了哪些服務(wù);COM服務(wù)器:包含COM對象代碼的模塊,一個(gè)COMResult: S對象可以實(shí)現多個(gè)接口;raise Exception. Create(Could not get computer name. )COM客戶(hù):調用接口以便獲得COM服務(wù)器提供的服務(wù)客戶(hù)端知道要獲得哪種服務(wù),但不知道cOM服務(wù)器位于何這樣就實(shí)現了 GetName方法(6)編譯并保存我們的工程然后點(diǎn)擊Run菜單中的下面我們就來(lái)實(shí)現一個(gè)簡(jiǎn)單的例子。我們創(chuàng )建一個(gè)進(jìn)程內ctive Server,以便在系統中注冊我們的COM服務(wù)器。的COM服務(wù)器,它可以取得計算機的名稱(chēng)這項服務(wù)通過(guò)接口這樣COM服務(wù)器就創(chuàng )建完成了。我們可以發(fā)現 Delphi給GetName來(lái)公布我們生成的文件中有 P SrvcDLL tlb, P_SrvcDLL_TLB. p1)創(chuàng )建GOM服務(wù)器P SrvcDLL, dl,其中, P SrvcDLL, tb是類(lèi)型庫(可包含多個(gè)接打開(kāi) Delphi5,進(jìn)行以下操作口)文件, P_SrvcDLL_TLB. pas是類(lèi)型庫的源文件,包含了(1)選 FileI Close All-關(guān)閉所有項目TsystemHelp和其他幾個(gè)重要的類(lèi)的聲明 P SrvcDLL dll就是(2) File INew選 ActiveX頁(yè)中的 ActiveX Library,這可以我們的COM服務(wù)器了。讓 Delphi為我們生成cOM服務(wù)器代碼所在的模塊,這是一個(gè)2)創(chuàng )建cOM客戶(hù)DLL,把它以名字 P SrVcDLL保存;在Deph5中新建一個(gè)工程,在窗體上放置一個(gè) Label,3)Fe|New雙擊 ActiveX頁(yè)中的CoMO圖標,此個(gè)Edt,一個(gè) Button.。以 U_Client和 P_Client為名保存單元和時(shí)出現 COM Object wizard,我們在 ClassName中填入工程。然后點(diǎn)擊 Project菜單中的 Add To Project.,選項把SystemHelp,保留 Instancing和 Threading Model的默認選項P SrvcDLL TLB添加到工程中來(lái),在窗體對應的單元的UesDescription填入“ COM Programming in Delphi is so easy子句中添加 P SrvcDLL TLB,這樣我們就可以使用剛才創(chuàng )建點(diǎn)擊“OK”,此時(shí)出現 Type Library Editor,在這里我們可以編的COM服務(wù)器了。為窗體類(lèi) TForml添加私有變量Fsys輯COM對象暴露給它的客戶(hù)的接口。在左邊可以看到, Delpht temHelp: ISystemHelp,然后雙擊窗體上的Buon,為它的單擊給我們列出了接口和實(shí)現這個(gè)接口的類(lèi)的名稱(chēng)?,F在,我們在事件編寫(xiě)如下代碼ISystemHelp”上點(diǎn)擊右鍵,選擇 New I Method,為接口添加方procedure TForm1. Button 1Click(Sender: TObject)法, Delphi把這個(gè)方法命名為 Method,我們把它改為GetName,然后點(diǎn)擊右邊的 Parameters頁(yè)簽,為 Return Type選FSystemHelp: CoSystemHelp Create取LPSTREdit1. Text FSystemHelp GetNam4)關(guān)閉 Type Library Editor,以USrc的名字保存剛剛生成的 UnitI單元類(lèi) CoSystemHelp由 Delphi自動(dòng)生成,它的聲明在單元(5)在U_Svc單元中, Delphi給我們生成的 TSystemHelp P_ SrVcDLL TLB中,它的 Create方法借助同一單元中聲明的的聲明如下:ISystemHelp的ⅢD來(lái)生成了所需要的COM對象然后調用這TSystemHelp= class(TTypedComobject, ISystemHelp個(gè)COM對象的 GetName方法來(lái)得到了計算機的名稱(chēng)。最后保存并運行我們的工程,點(diǎn)擊窗體上的Butn后,我function GetName: PChar: stdcall們發(fā)現計算機的名稱(chēng)已經(jīng)出現在Edit中了,這說(shuō)明我們的客戶(hù)和COM服務(wù)器已經(jīng)很好的開(kāi)始工作了??梢钥吹? TsystemHelp從 TType Comobject繼承而來(lái),并參考文獻實(shí)現了接口 ISystemHelp;編輯 U Svc單元中 renAme方法為(1潘愛(ài)民COM康理與用,隋隼幽社,199如下代碼:[2] Charlie Calvert. Delphi 4 Unleashed. Sams Publishing, 1999function TSystemHelp GetName: PChar;[3] Steve Teixeira, Xavier Pacheco. Delphi 5 Developers GuideLen: DWord4]中國煤化工Shepherd. ProgrammingS: PCharCNMHG C.歡迎訂閱歡迎來(lái)稿歡訓刊堂廣告
-
C4烯烴制丙烯催化劑 2020-06-12
-
煤基聚乙醇酸技術(shù)進(jìn)展 2020-06-12
-
生物質(zhì)能的應用工程 2020-06-12
-
我國甲醇工業(yè)現狀 2020-06-12
-
JB/T 11699-2013 高處作業(yè)吊籃安裝、拆卸、使用技術(shù)規程 2020-06-12
-
石油化工設備腐蝕與防護參考書(shū)十本免費下載,絕版珍藏 2020-06-12
-
四噴嘴水煤漿氣化爐工業(yè)應用情況簡(jiǎn)介 2020-06-12
-
Lurgi和ICI低壓甲醇合成工藝比較 2020-06-12
-
甲醇制芳烴研究進(jìn)展 2020-06-12
-
精甲醇及MTO級甲醇精餾工藝技術(shù)進(jìn)展 2020-06-12