天天看點

Symbian OS進階開發篇之Ecom(1)

在C++中,抽象類和虛函數意味着程式可以調用或通路類而不用知道其具體實作,這種機制允許實作在接口定義之後進行。這種實作稱之為插件。Symbian OS中的ECOM就是一個通用的插件架構,提供了一個簡單的機制,用以注冊、查詢接口實作,選擇使用合适的實作,提供插件版本控制等。介紹ECOM如何完成這些工作前我們先來看一下插件系統的本質。

一個客戶程式希望通路一個對象來進行一些處理,這個對象的具體實作直到運作之前是不知道的,我們隻知道處理的一般特性和接口的定義,并且這些處理在相同的接口下有不同的變化。這樣的系統有四種清晰定義的角色,即請求服務的客戶程式、如何請求服務的接口定義、提供處理請求的接口實作以及提供客戶程式通路具體實作(執行個體化)的架構。如下圖所示:

Symbian OS進階開發篇之Ecom(1)

圖1 插件關系圖

執行個體化是這樣的系統的核心,它負責提供識别出來的服務,運作時加載正确的接口實作。Ecom就是這樣的一個架構,我們接下來分别從接口用戶端、接口實作及接口定義這幾方面來了解Ecom。

接口用戶端

插件架構的客戶程式使用架構提供的C++接口來實作Ecom,除了以下的步驟并不需要額外的步驟:

  • 連結Ecom架構的庫檔案ecom.lib
  • Include接口定義檔案
  • 通過接口的NewL方法擷取一個對象,通常客戶程式傳遞一些資料來表明所需對象的特性。
  • 使用對象
  • 對象使用結束後删除
  • 調用REComSession::FinalClose方法清除記憶體的使用

由于架構提供了大部分功能,是以接口用戶端不需要做太多的工作,隻需調接口即可,但記憶體的回收清除工作是一個例外。為了確定在不用時能正确解除安裝,并釋放所用的記憶體,借口用戶端應該遵循以下規則:

  • 當那些從接口擷取的執行個體化對象不在使用時,應該删除。
  • 諸如服務、應用程式及測試程式等程序,必須在退出之前調用REComSession::FinalClose方法使得Ecom架構能夠進行最終的清除工作。這個方法必須在所有執行個體化對象被删除之後才能調用。
  • 如果在庫檔案中使用了Ecom,應該在庫檔案的退出函數中調用REComSession::FinalClose方法。

需要注意的是FinalClose方法不能在接口或插件類的析構函數中調用。

接口定義

接口定義有兩個目的,一是為用戶端的使用定義函數,這些函數通常是純虛函數,由實作者從它派生來提供具體的功能;另一目的是提供對象執行個體化功能,這個功能并不建立接口類自己的執行個體,而是使用Ecom建立合适的實作執行個體,傳回給客戶程式。接口在析構時會通知Ecom對象已被析構。

通常接口定義為Ecom提供了可用實作的識别,這種識别可以使顯式的,如一個UID标示一個特殊的實作,也可以是間接的,如用資料來比對實作的自我描述。這個選擇的過程稱為Resolution,執行的實體成為Resolver。Ecom提供了一個預設的Resolver,但接口定義可以按需提供自己的Resolver。

接口實作

一個接口實作提供接口約定的服務,實作以C++标準的方式來做,從基類派生。一個或多個接口實作集中在一個Dll中,稱為一個接口實作集,一個集合可以擁有多個接口的實作,每個集合有兩個關鍵的功能供Ecom使用:

  • 導出一個工廠函數的數組使得實作能被建立
  • 釋出一個注冊資源檔案,列出所有的實作和屬性

Ecom架構安全

Symbian OS的安全架構提供了惡意及非法代碼的防護,保證了平台的安全性。以下是平台安全與Ecom插件架構相關的幾個方面:

  • 平台安全的能力模型(capability model),它防止程序加載和使用比自身安全性還低的Dll。
  • 控制軟體安裝,以確定其不能破壞已安裝的軟體。
  • 控制程序對特殊檔案的通路。

在Ecom中,插件是一個Dll,當提供接口實作的Dll被執行個體化時它被加載到用戶端程序,如果插件Dll的能力(capability)比加載它的程序的能力低的話,系統會報請求被拒的錯誤(-46)。

插件的提供者必須考慮以下的安全性因素:

  • 如果提供一個無能力的插件,那這個插件隻能被無能力的用戶端程序加載使用。
  • 如果插件隻為某個程式所用,那麼那個程式的文檔中應給出它需要什麼樣的能力。
  • 如果想讓插件能被所有程式使用(除了核心和檔案服務),那麼應該将其設為完全能力的即Tcb, 當然這麼高的能力是需要通過Symbian Sign的。
  • Resolver插件是一個特例,它被Ecom自身的一個服務程序加載,是以必須是被服務所信任的。這時插件要有ProtServ能力。

平台安全架構嚴格要求所有的可執行代碼,包括插件,都放在/sys/bin/目錄下,且對此目錄的通路有限制,僅有少數的系統程序能夠通路。另外插件所需的資源檔案安裝在/resource/plugins/目錄下。

Ecom架構小結

Ecom架構代表接口定義提供在運作時解析(Resolve)和加載合适實作的能力,它是客戶伺服器結構,有一個單件模型的用戶端會話類REcomSession,這個類具有建立、銷毀和枚舉實作的功能,服務端控制着實作的注冊和加載。

前面提到過架構提供了預設的Resolver,來選擇合适的實作,接口可以通過詢問架構來建立最合适的實作,或要求傳回所有比對的實作的清單,再通過其他方法來選擇一個合适的實作。

[待續....]

繼續閱讀