轉自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的釋出版本釋出必須保證順序的不變性