• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            franksunny的個人技術空間
            獲得人生中的成功需要的專注與堅持不懈多過天才與機會。 ——C.W. Wendte

             

            DLLDynamic Link Library)是一段特殊的代碼,它能夠被外部程序在程序運行的時候調用。在DLL里面的代碼可以同時被許多外部程序共享,而且不會引起手機內存的重復分配。

             

            DLL根據接口的類型Symbian系統支持兩種類型的DLL:靜態接口DLL和多態接口DLL

            靜態接口DLL主調程序啟動的時候被系統自動載入到手機內存里面(唯一的例外是如果該DLL是在ROM只讀存儲器里面,那么可以直接通過它的地址進行調用)。并且如果沒有外部程序使用它了,它將被自動的從內存中卸載。靜態接口DLL在系統內提供了一系列唯一的函數(例如,兩個具有相同導出函數的DLL在系統中也不會混淆)。靜態接口DLL具有.dll文件后綴,通常用于在Symbian系統中實現應用程序引擎(例如,與UI無關的代碼)。

             

            多態接口DLL是只帶一個單獨導出函數的普通DLL,一般都是通過調用RLibrary::Load()函數才能被載入到內存中,而且在卸載的時候,也最好通過RLibrary::Close()函數進行卸載。多個多態接口DLL可以為外部程序導出多個相同函數名的函數。所以,這種DLL通常情況下被廣泛應用于實現某個應用程序框架功能擴展時候的插件。在Symbian系統中,多態接口DLL可以有多種不同的文件后綴。其中最著名的一個就是.app結尾的(應用程序),.ldd(邏輯設備驅動),.tsy.csy(電話和通信服務模塊)等等。。。

             

            在本文中,我們將只關注靜態接口DLL技術,它是你我在開發中最最常用的DLL類型。我們將以通用DLL的繼續我們的內容。

            靜態接口的DLL

            DLL調用者的角度來看,DLL有三個文件組成:

            1)頭文件:.h的文件后綴,可以#include到主調程序的代碼中去,只有在編譯

            的時候有用。

            2)導出文件:.lib的文件后綴,可以由主調程序進行鏈接,這個文件記載了DLL的提供的所有接口函數名稱和地址。(arm版本中應該是dso后綴

            3DLL文件本身:.dll的文件后綴包括所有.lib文件記載的接口函數的具體實現,主調函數在運行的時候實際調用和執行的部分。

             

            DLL編寫者的角度來看,DLL可以被看成是一個完整的Symbian項目。它由以下幾部分組成:

            1)項目自己的MMP文件(在bld.inf文件中列出的)

            2)一個頭文件,指定了該DLL需要導出的接口

            3)源代碼文件,具體導出函數的實現

             

            頭文件

            DLL的頭文件與其它類的頭文件的頭文件非常類似。不同的地方在于使用了IMPORT_C宏來定義所有導出函數

            class CMyEngine : public CBase

            {

            public:

               // These functions are visible by the

               // clients of the DLL and needs to have

               // the IMPORT_C tag

               IMPORT_C static CMyEngine* NewL();

               IMPORT_C static CMyEngine* NewLC();

             

               IMPORT_C void MyPublicMethod();

               IMPORT_C void AnotherPublicMethod();

               ...

            private:

               // These functions are not visible by the

               // clients of the DLL and then do not need

               // the IMPORT_C tag

               CMyEngine();

               void ConstructL();

               void SomePrivateMethod();

            }

             

            實現文件

            編寫DLL工作本身沒有什么需要復雜的地方,但是有兩個重要的地方需要留意:

            1E32Dll()函數必須實現

            2另外一個特殊的宏,EXPORT_C,應該加在每個導出函數實現的前面

            例如:

            // This function is mandatory for all DLLs

            EXPORT_C TInt E32Dll(TDllReason)

            {

                    return KErrNone;

            }

             

            // This function is exported: The EXPORT_C tag shall be used.

            EXPORT_C void MyPublicMethod()

            {

               ...

            }

             

            // This one is not: The EXPORT_C tag shall not be used.

            void SomePrivateMethod()

            {

              // Do Something

            }

             

            MMP文件

            DLLMMP文件應該有以下特點

            1)定義項目(project)的類型是dll

            2)使用正確的UID2的值(0x1000008d)

            在開發過程中,你也應該通過EXPORTUNFROZEN告訴編譯環境,DLL接口還沒有定稿,還可以隨時修改

            例如:

            TARGET        MyEngine.dll

            TARGETTYPE    dll

            UID           0x1000008d

            ...

            EXPORTUNFROZEN

             

            DLL接口定稿(Freezing DLL

            一旦你完成了DLL的開發,在你發行你的DLL版本之前,應該把接口定稿(Freezing)這樣可以確定將來發行的DLL可以向下兼容。

            通過將項目的MMP文件中的EXPORTUNFROZEN關鍵字去掉,用常規的方法重新建立DLL,來實現DLL庫的定稿。這時候會有“.def文件不存在”的編譯警告信息出現,不要緊,繼續就建立當前項目,在項目編譯完畢以后,你可以用如下命令定稿:

            abld freeze [platform]

            例如

             1bldmake   bldfiles;  

             2abld   build  gcce;  

             3abld   freeze gcce; 

            注意:

            這里通常有三個定稿的def文件夾:在二版本中編譯armi時,用abld freeze armi產生的是BMARM文件夾和對應的Def;在三版本中編譯gccearmV5時會產生EABI文件夾和對應的Def;而用wins時則編譯產生BWINS文件夾和對應的Def

            另外關于EXPORTUNFROZEN,有必要再啰嗦兩句:在沒加該關鍵字的時候,可以進行接口定稿(即產生def文件),但是不能產生lib文件,如此在編譯包含該lib的工程中編譯mmp時會報lib文件找不到的錯誤;加了EXPORTUNFROZEN就能產生lib文件,但是接口就已經凍結了,這個時候再修改接口,新修改的接口就沒有被導引出來(個人總結)。

            所有的ARM平臺共享一個.def文件,但是對于wins模擬器和winscw CodeWarrior環境來說,他們有不同的.def文件。

            一旦項目已經定稿,重新生成makefile,這時候導入的lib會直接通過定稿的.def文件生成。



            本文很大一塊內容屬于轉載別人的,但是今天發布本文是找不到鏈接了,個人只是驗證了下,為下篇EasyDgm使用做下預備知識
            posted on 2008-05-16 20:10 frank.sunny 閱讀(4650) 評論(0)  編輯 收藏 引用 所屬分類: symbian 開發

            常用鏈接

            留言簿(13)

            隨筆分類

            個人其它博客

            基礎知識鏈接

            最新評論

            閱讀排行榜

            評論排行榜

            99精品伊人久久久大香线蕉| 久久成人国产精品| 国产精品99久久不卡| 久久国产香蕉一区精品| 亚洲伊人久久成综合人影院| 国产精品乱码久久久久久软件| 久久人人爽人人爽人人片av高请| 国内精品久久国产大陆| 日本加勒比久久精品| 色欲久久久天天天综合网精品| 久久96国产精品久久久| 久久天天躁狠狠躁夜夜不卡| 精品一区二区久久| 亚洲国产精品无码久久| 97超级碰碰碰碰久久久久| 99久久夜色精品国产网站| 久久久精品波多野结衣| 久久免费的精品国产V∧| 久久久久无码专区亚洲av| 精品国产乱码久久久久久1区2区 | 无码专区久久综合久中文字幕 | 欧美午夜精品久久久久免费视| 国产精品99久久久久久猫咪 | 久久亚洲精品无码AV红樱桃| 久久er国产精品免费观看8| 久久青青草原亚洲av无码app | 久久97久久97精品免视看秋霞| 国内精品人妻无码久久久影院| 久久只这里是精品66| 污污内射久久一区二区欧美日韩 | 久久男人AV资源网站| 四虎国产精品免费久久5151| 久久亚洲精精品中文字幕| 麻豆精品久久久久久久99蜜桃| 久久伊人色| 亚洲欧美一区二区三区久久| 久久久久久极精品久久久| 久久久久亚洲精品无码网址 | 久久99精品国产麻豆蜜芽| 免费精品99久久国产综合精品| 国产精品视频久久|