天天看點

Symbian作業系統結構之一:DLL

 轉自http://blog.sina.com.cn/s/blog_6017017a0100dvmg.html

*DLL(動态連結庫)是經過編譯的C++代碼,它們可以被正在行動的程序載入

*Symbian作業系統中的DLL主要分為兩類

 - 共享庫DLL(靜态接口)

 - 多态接口DLL(插件)

*共享庫DLL

 - 共享庫根據子產品定義檔案(.def)導出API函數

 - 導出函數數目是任意的

 - 每一個導出函數都是DLL的一個進入點

 - 共享庫釋出一個頭檔案(.h)和一導入庫(.lib)用以解析導出函數

 - 當使用共享庫的可執行代碼運作時,作業系統加載器會載入其使用的所有DLL,以及這些DLL會使用到的其它DLL

*多态接口DLL

 - 實作由架構單獨定義的抽象接口

 - 通常使用不同的擴充名來表示DLL的本質差別,比如

 •檔案系統插件使用.fsy

 •協定子產品插件使用.prt

 - 具有單獨的接入點“工廠”函數,用于執行個體化

 - 通常用于實作固定接口的不同實作(插件)

 - 從Symbian作業系統v7.0開始,最常用的插件是ECOM插件

*DLL使用的UID

 - Symbian作業系統UID是32位的,用于唯一 辨別檔案類型

 - Symbian作業系統使用三種UID組合來唯一地辨別一個二進制可執行檔案

 - 對于DLL,這三種UID分别是

•UID1:系統範圍區分EXE和DLL

  - 對于EXE,targettype為exe   (targettype是在mmp檔案中定義的)

  - 對于共享庫,targettype為DLL

  - 對于多态ECOM插件DLL,targettype為PLUGIN

•UID2:區分共享DLL和多态接口DLL

•UID3:唯一地辨別元件,需要Symbian簽名

*從DLL中導出函數

 - 共享庫DLL通過導出函數來提供對其API的通路

 - 在Symbian作業系統中,每一個需要導出的函數需要在其頭檔案定義之前加上IMPORT_C宏

 - 對應的函數需要在.cpp檔案中加上EXPORT_C

class CMyExample : public CSomeBase

{

 public:

  IMPORT_C static CMyExample* NewL();

 public:

  IMPORT_C void Foo();

 …………

};

EXPORT_C CMyExample* CMyExample :: NewL()

{……}

EXPORT_C void CMyExample :: Foo()

{……}   

*從DLL中導出函數的原則

 - 内聯函數不能被導出,因為沒有必要

 ·不用導出,調用者已經可以通過頭檔案進行通路

 - 隻有需要在DLL之外使用的函數才有必要導出

 ·私有函數無法被用戶端通路

 - 所有的虛函數,不論是公共的,受保護的,還是私有的,都應該被導出

 ·派生類可能對它們進行重新實作

*按順序和按名字查找函數

 - 在大多數作業系統中,DLL的接入點可以按照其名字或着按照其導出的順序來識别

 - Symbian作業系統不提供按名字查找函數的機制,因為它會為DLL大小造成額外的開銷

 - Symbian作業系統隻支援按順序查找函數

 ·DLL的釋出版本釋出必須保證順序的不變性