1. 程式人生 > >基於COM的輕量級元件技術的簡單實現

基於COM的輕量級元件技術的簡單實現

0  引言

  在軟體開發中,元件是一些小的二進位制可執行程式,它們可以給應用程式、作業系統以及其他元件提供服務。實際應用中主要採用COM技術開發軟體元件。這是由Microsoft提出的一種元件標準,它定義了元件程式之間進行互動的標準。標準的COM技術主要用於Microsoft Windows平臺,是windows作業系統和各種應用軟體的結構基礎,其突出優點是軟體之間直接通過二進位制介面進行通訊。

  開發自定義的COM元件就如同開發動態的、面向物件的API。多個COM物件可以連結起來形成應用程式或元件系統。元件可以在執行時刻,並在不被重新連結或編譯應用程式的情況下被卸下或替換掉。

  要實現基於COM標準的跨平臺輕量級元件,需要滿足三個條件:

  一是原始碼級跨平臺,可以在LINUX和WINDOWS上使用;

  二是像容器一樣的管理元件DLL/SO;

  三是功能元件化。

  在工控系統組態過程中,通常存在著人際介面軟體開發週期長,維護困難,升級不便等缺點,為了增強組態軟體的行業競爭力,希望從軟體開發模式上改變當前系統軟體的缺陷,同時為了適應系統軟體跨平臺的需要,根據COM標準組件技術,並結合QT、以及組態人機介面軟體自身的特點,可以實現輕量級元件技術。本文所述的輕量級元件技術就是以COM標準為基礎的,並根據實際的應用環境做了某些改變。

  1  輕量級元件各部分的協作關係

  跨平臺輕量級元件技術可以COM標準為基礎來實現,可先定製Com庫,並確定編寫元件的規範。

  輕量級元件技術使用的是分層結構,該結構通常可分為客戶端、Com庫、元件端三個層。圖1所示是其輕量級元件的結構圖。其中,元件端用於提供功能和介面;COM庫負責元件和客戶端的通訊,客戶端則通過Com庫建立元件,並呼叫元件介面。

  它們三部分一般通過介面進行通訊,其具體過程如圖2所示。

  在實際應用中,Com庫一般可由圖3所示兩部分構成。實際上,圖3中的Comku是一個動態庫,負責提供最核心的功能:ExtensiONSySTem靜態庫是對Comku的封裝,為了使用方便,它同時提供了生成外掛介面的巨集以及CPluginManager類中的介面函式。下文中如不特別指明,Com庫均表示單一的動態庫。

  整個組態的人機介面軟體是在QT中實現的,因此元件的核心庫也需要使用QT來實現。QT是一個多平臺的C++圖形使用者介面應用程式框架。它可以提供給應用程式開發者建立藝術級的圖形使用者介面所需的所有功能。QT是完全面向物件的、很容易擴充套件、且可支援原始碼的級跨平臺。直接在QT環境中實現輕量級元件技術,以達到跨平臺的目的。實際上,元件庫本身並不依賴於QT環境。

  2 Com庫的原理及功能

  對於使用了輕量級元件技術的應用程式,Com庫主要用來管理外掛DLL、建立和銷燬元件指標,它像容器一樣,可以儲存當前應用程式中用到的外掛資訊和介面資訊,並在使用者需要的時候返回正確的外掛介面指標。

  2.1  管理元件的功能

  Com庫中可維護兩個連結串列,分別用於存放外掛DLL的資訊和介面資訊。

  每次使用Com庫載入的DLL資訊都將記錄到外掛連結串列中。在為使用者建立介面前,還需要查詢外掛連結串列,以判斷該外掛是否已經被載入,如已載入,便可直接使用,不需要重新載入,這樣可以節省系統開銷。由於在應用中載入的外掛數目有限,因此,查詢連結串列花費的時間代價可以忽略,圖4所示為存放外掛資訊的結構。其中CLASS_TABLE結構存放外掛DLL的資訊。介面連結串列可用來儲存成功返回給使用者的外掛介面。使用者申請介面時,Com庫先在介面連結串列中查詢該介面,如果已經存在,則直接返回,這樣可以節省建立介面的時間,也可以有效地控制介面物件的數目。

  圖5所示是CIMPL結構用於存放外掛介面的資訊。

  釋放這兩個連結串列的過程就是釋放元件資源的過程。在COM標準中,資源管理是通過一個由介面自己負責的資源計數器完成的。在輕量級元件技術中,根據應用需要,每個介面只需要一個介面指標,而不需要資源計數器,釋放資源的任務由Com庫完成。當應用程式關閉時,可將兩個資源連結串列中的介面物件刪除,並將元件DLL/SO解除安裝。

  2.2  建立外掛介面指標

  Com庫的核心功能就是建立元件介面指標。

  建立元件介面指標的函式為CoCreateInstance,它具有圖6所示的三個引數。其建立過程如圖7所示。


  2.3 ExtensionSystem靜態庫

  ExtensionSystem靜態庫中已載入了Com庫,並將Com庫的建立介面指標函式封裝成介面。這樣,客戶端在使用時,就不需要關注Com庫的具體位置,而可以直接呼叫ExtensionSystem的介面來獲取外掛介面指標。

  2.4  配置檔案

  配置檔案主要用來標識當前程式所需要載入的元件,以及元件的位置。配置檔案可分為兩部分:

  第一部分用於標識載入的元件和載入順序;第二部分用於標識元件的位置。圖8所示是配置檔案的資訊示意圖。

  DLL/SO元件編寫規則

  輕量級元件技術要求元件DLL/SO應按照約定的格式編寫,只有元件庫載入後,才能為客戶端建立元件介面指標。

  一個類似於IUnknown的基介面,通常是所有介面都需要繼承的,其程式碼如下:

  Release函式可用來釋放元件介面物件。

  每個DU/SO中都需要有一個類實現IPlugin介面,該類稱為元件類,Init函式在ExtensionSysten中被呼叫時,可以在其中完成元件的初始化工作,其具體程式碼如下:

  每個元件DLL/SO都需要匯出一個建立介面的函式,形式如下:

  4  結束語

  QT本身提供有外掛機制,但是,載入方式對使用者是不可見的,因此,出現問題後,往往不利於除錯。而本文所述的元件編寫方式和載入方式使用約定的形式,這種形式並不侷限於QT中,而是在支援標準c++的編譯環境中都可以使用,因而是一種通用的輕量級元件技術。