国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

COM組件技術探究

2017-03-21 20:33張春艷張海波
電腦知識與技術 2016年33期
關鍵詞:接口

張春艷+張海波

摘要:COM Component(COM組件)技術是開發(fā)軟件組件的方法,是微軟公司為了解決軟件復用,縮短軟件開發(fā)時間而開發(fā)的一種新的軟件開發(fā)技術。對COM組件的接口、COM組件的實現(xiàn)以及與普通DLL的區(qū)別進行了探究,以COM組件開發(fā)為研究視角,對COM組件開發(fā)的原理和方法進行分析,結合實例說明具體的開發(fā)步驟,并對COM組件在PHP上的調(diào)用方法做了具體示例。

關鍵詞:COM;組件對象模型;接口

中圖分類號:TP391 文獻標識碼:A 文章編號:1009-3044(2016)33-0096-03

Abstract: COM (Component Object Model) component technology is a method of developing software components. It is a new software development technology developed by Microsoft Corporation in order to solve software reuse and shorten software development time. This paper mainly discusses the interface of COM component, the realization of COM component and the difference between it and common DLL. It analyzes the principle and method of COM component development from the perspective of COM component development. Combined with an example to describes the specific development steps and calling the COM component on PHP.

Key words: COM; Component Object Model; Interface

1 概述

COM組件技術是一種十分完善的面向?qū)ο蟮募夹g規(guī)范。通常是以WIN32動態(tài)鏈接庫(DLL)或可執(zhí)行文件(EXE)的形式發(fā)布的可執(zhí)行代碼組成的,可以在跨平臺條件下實現(xiàn)調(diào)用,對于代碼重用有很大的意義。COM組件的核心思想是定義軟件中可以重用的部分,實現(xiàn)代碼復用。

COM組件的核心是組件和接口。其中組件是具有一定邏輯功能的可執(zhí)行代碼,而接口實現(xiàn)了對組件代碼的封裝與隔離。通常情況下一個有兩個接口的COM組件如圖1所示:

2 COM組件接口

COM組件最重要的部分是組件的接口。COM組件通過接口與外界進行聯(lián)系,外界使用COM組件也必須知道COM組件的接口。因此COM組件的接口在系統(tǒng)中起著決定性作用。每個COM組件都必須有這三個接口:IUnknown、IClassFactory和IDispatch,其他接口都是直接或間接從這個接口派生而來。

2.1 基本接口

COM組件的基本接口是Iunknown接口,在COM組件中所有接口都以“I”開頭。Iunknown接口的主要作用是對COM組件的所有接口進行標準化,以方便調(diào)用COM組件。COM組件的接口都必須符合一定的規(guī)范,在這個規(guī)范中規(guī)定任何一個接口都繼承于Iunknown接口,這個接口主要有以下幾個函數(shù):

這里用struct定義Interface,由于struct關鍵字的成員屬性為public,接口是用來與外界進行聯(lián)系,接口的成員屬性也應該為public。這里用_stdcall標記的函數(shù)將使用標準的調(diào)用約定,用這個關鍵字修飾的函數(shù)的參數(shù)將以堆棧從右向左的順序傳遞,也就是說這些函數(shù)將刪除參數(shù)在函數(shù)返回到調(diào)用者之前。QueryInterface函數(shù)是對組件進行自我描述的關鍵字函數(shù),通過這個函數(shù),用戶可以查詢某個組件是否支持特定的接口。另外的AddRef和Release這兩個函數(shù)實現(xiàn)了對組件調(diào)用次數(shù)的引用計數(shù)。通過使用這兩個函數(shù),使組件可以自己實現(xiàn)刪除內(nèi)存。在COM組件中將對引用計數(shù)這個值進行維護,當用戶從COM組件中取得一個接口時,將這個值加一,當用戶使用完這個接口時,這個值減一。當引用計數(shù)為零時,徹底將組件從內(nèi)存中刪除。AddRef函數(shù)用來對引用計數(shù)值加一,Release對引用計數(shù)的值減一。

2.2 接口IClassFactory

IClassFactory的作用是創(chuàng)建COM組件。每個組件都必須有一個與之相關的類廠,由類廠創(chuàng)建組件實例,然后把實例指針交給客戶程序。IClassFactory最重要的一個函數(shù)就是CreateInstance,類廠就是通過調(diào)用這個函數(shù)創(chuàng)建組件實例的。但是一般情況下不會直接調(diào)用它,通過API函數(shù)CoCreateInstance進行調(diào)用。

2.3 IDispatch調(diào)度接口

IDispatch接口也繼承于IUnknown接口,對組件執(zhí)行調(diào)度任務。由于COM組件是通過虛函數(shù)表來實現(xiàn)對函數(shù)的調(diào)度的,也就是說COM組件必須使用指針來實現(xiàn)對函數(shù)的調(diào)度,但是并不是所有的語言都支持指針,因此調(diào)度接口就是用來解決這一問題。在調(diào)度接口中,將組件的每個函數(shù)以及每個屬性都進行相應的編號,在客戶程序要調(diào)用這些函和屬性的時候就把這些編號傳給IDispatch 接口,再根據(jù)這些編號調(diào)用相應的函數(shù)。

3 COM組件的實現(xiàn)

按照組件在運行時所處的位置,它可分為進程內(nèi)服務器和進程外服務器,其中進程外服務器又分為本地服務器和遠程服務器。進程內(nèi)服務器是指服務器和客戶在同一進程空間中運行的服務器。它是以DLL形式封裝的COM組件。以EXE封裝的組件叫做進程外組件。

3.1 以動態(tài)鏈接庫的形式實現(xiàn)

COM組件可以以動態(tài)鏈接庫的形式實現(xiàn),DLL格式的COM組件可以共享其鏈入的應用程序的地址空間,方便客戶訪問函數(shù)的指針列表。

3.2 以可執(zhí)行程序的形式實現(xiàn)

在某些情況下,需要用EXE來實現(xiàn)組件,使EXE可以向外界提供自己擅長的服務功能,客戶可以通過接口實現(xiàn)自己很難完成的任務,客戶還可以通過接口控制應用程序,更靈活更有效的實現(xiàn)EXE的功能。

在EXE中實現(xiàn)組件和在DLL中實現(xiàn)組件主要有兩個區(qū)別,一是EXE提供的組件將與客戶程序不在同一進程中,這需要用到代理/殘根機制來完成在跨進程的調(diào)用中參數(shù)的調(diào)整。二是EXE不像DLL,它是主動的,可以對自己的生命期進行控制。

4 COM組件與普通DLL的區(qū)別

COM組件與DLL都是為解決代碼重用設計的,然而兩者卻有很多不同。COM組件便于升級維護功能擴充,有很好的安全性,可以輕松的實現(xiàn)進程間調(diào)用,具有封裝、繼承、多態(tài)的面向?qū)ο蟮奶卣?,而DLL在這些方面都有很大不足。64位的系統(tǒng)不能調(diào)用32位的DLL,而將DLL封裝成COM組件就可以被64位系統(tǒng)調(diào)用了。兩者最大的區(qū)別是COM組件是以接口方式提供給用戶的一種二進制的使用規(guī)范,而DLL是以函數(shù)集合的方式提供給用戶進行調(diào)用。

在開發(fā)難度上COM組件相對DLL要更為復雜,它需要滿足規(guī)范,是相對獨立的模塊,可以被其他語言調(diào)用,而DLL開發(fā)簡單可移植性差,在調(diào)用上沒有COM組件簡單。

5 COM組件在PHP上的應用

在Windows平臺下,PHP提供了內(nèi)置的COM功能,利用PHP的COM類可創(chuàng)建有關組件對象的實例,基本格式如下:

$obj =new COM(“ProgID”);

其中COM為類名,ProgID為組件對象名,$obj為組件對象的實例變量。通過實例變量并使用“->”運算符,即可引用組件對象的有關屬性、集合與方法。若將實例對象賦值為空(NULL),即可清除相應的對象實例。

下面通過筆者所做的基于COM組件在PHP上調(diào)用的實例來說明開發(fā)COM組件的過程以及在PHP上調(diào)用的方法。

首先打開Visual C++或者Visual Studio新建空白解決方案,添加新建項目,選擇ATL項目,選擇動態(tài)鏈接庫(DLL)選項。打開類視圖,添加類,選擇ATL簡單對象,進入ATL簡單對象向?qū)Ш?,就可以設置對象名稱,這里我設置的是Fun。在第一個空白框內(nèi)填寫對象名稱,其他框會自動填寫。

運行網(wǎng)頁顯示:Hello PHP 2016。調(diào)用成功。

在這個基礎上,我們可以開發(fā)更復雜的COM組件,不過還需要對COM組件接口更深一步的研究。

6 結束語

通過對COM組件技術的研究,可以知道COM組件在使用中有很多優(yōu)點。COM組件可以很好的實現(xiàn)代碼重用,提高軟件的復用率,而且也可以增強軟件的可靠性,編程者可以跨語言調(diào)用COM組件,使用不同的語言開發(fā)也不會有影響,而且方便開發(fā)者在不同的環(huán)境中對COM組件進行調(diào)用,不用考慮32位還是64位系統(tǒng)的問題,這些優(yōu)點都極大的提高軟件的開發(fā)速度,降低開發(fā)成本。然而對COM組件的接口復雜性以及兼容性問題的研究還需要進一步進行研究。隨著COM組件技術的不斷完善,COM技術的應用將會更加廣泛。

參考文獻:

[1] 潘恒.中間件技術——COM組件的探究[J].科協(xié)論壇,2011(4):61-62.

[2] 趙海春.COM組件的設計與使用 [J].邵陽學院學報:自然科學版,2009,6(1):58.

[3] 孔夢榮,鄭秋生,杜獻峰.COM 組件技術探究[J].中原工學院學報,2004,15(2):22- 23,70.

[4] 潘愛民.com原理與應用[M].北京:清華大學出版社,2000.

猜你喜歡
接口
某電站工程設計管理與施工、質(zhì)量控制接口關系研究
含有二氧化鈦薄膜增強虛擬閥的微流控芯片用于二維凝膠電泳分離
岢岚县| 渭南市| 海兴县| 旅游| 柳江县| 儋州市| 梨树县| 敦煌市| 海兴县| 华安县| 资阳市| 时尚| 巩义市| 安塞县| 尼木县| 雷波县| 芷江| 开原市| 太湖县| 辉县市| 瑞金市| 太仆寺旗| 哈尔滨市| 铜山县| 涞源县| 府谷县| 安溪县| 汾阳市| 修文县| 乌兰察布市| 红桥区| 井冈山市| 衡水市| 射洪县| 哈尔滨市| 万宁市| 阿瓦提县| 库尔勒市| 麻江县| 宁阳县| 江都市|