為Symbian編寫動態鏈結庫DLL

2021-04-17 00:03:04 字數 2208 閱讀 9025

dll(dynamic link library)是一段特殊的**,它能夠被外部程式在程式

執行的時候呼叫。在dll裡面的**可以同時被許多外部程式共享,而且不會引起

手機記憶體的重複分配。

靜態介面vs多型介面

symbian系統支援兩種型別的dll:

(1)靜態介面dll

(2)多型介面dll

靜態介面dll在主調程式啟動的時候被系統自動載入到手機記憶體裡面(唯一的例外是

如果該dll是在rom唯讀儲存器裡面,那麼可以直接通過它的位址進行呼叫)。並且

如果沒有外部程式使用它了,它將被自動的從記憶體中解除安裝。靜態介面dll在系統內

提供了一系列唯一的函式(例如,兩個具有相同匯出函式的dll在系統中也不會混淆)

靜態介面dll具有.dll檔案字尾,通常用於在symbian系統中實現應用程式引擎

(例如,與ui無關的**)。

在本文中,我們將只關注靜態介面dll技術,它是你我在開發中最最常用的dll型別。

我們將以通用dll的繼續我們的內容。

靜態介面的dll

從dll呼叫者的角度來看,dll有三個檔案組成:

(1)標頭檔案:.h的檔案字尾,可以#include到主調程式的**中去,只有在編譯

的時候有用。

(2)匯出檔案:.lib的檔案字尾,可以由主調程式進行鏈結,這個檔案記載了dll的

提供的所有介面函式名稱和位址。

(3)dll檔案本身:.dll的檔案字尾包括所有.lib檔案記載的介面函式的具體實現,

主調函式在執行的時候實際呼叫和執行的部分。

從dll編寫者的角度來看,dll可以被看成是乙個完整的symbian專案。

它由以下幾部分組成:

(1)專案自己的mmp檔案(在bld.inf檔案中列出的)

(2)乙個標頭檔案,指定了該dll需要匯出的介面

(3)源**檔案,具體匯出函式的實現

標頭檔案dll的標頭檔案與其它類的標頭檔案的標頭檔案非常類似。不同的地方在於

使用了import_c巨集來定義所有匯出函式:

class cmyengine : public cbase

實現檔案

編寫dll工作本身沒有什麼需要複雜的地方,但是有兩個重要的

地方需要留意:

(1)e32dll()函式必須實現

(2)另外乙個特殊的巨集,export_c,應該加在每個匯出函式實現

的前面。

例如:// this function is mandatory for all dlls

export_c tint e32dll(tdllreason)

// 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()

mmp檔案

dll的mmp檔案應該有以下特點

(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

注意:所有的arm平台共享乙個.def檔案,但是對於wins模擬器和winscw codewarrior

環境來說,他們有不同的.def檔案。

一旦專案已經定稿,重新生成makefile,這時候匯入的lib會直接通過定稿的.def

檔案生成。

編寫動態鏈結庫

很多時候我們寫 的時候會經常用到某些 段,比方說求兩個或幾個整數的和或者將乙個整形陣列轉化為二叉樹等等。經常使用這些 但是每一次又得重新再寫一遍,次數多了等於就是重複無用勞動了。所以,可以自己動手寫乙個自己的動態鏈結庫,儲存起來。下次用到只需要加上庫就ok了,這樣既方便了自己又對動態鏈結庫本身的工作...

靜態鏈結庫和動態鏈結庫編寫

lib.h int add int x,int y lib.cpp include lib.h include stdafx.h int add int x,int y libtest.cpp include lib.h pragma comment lib,lib.lib int main int...

編寫 dll動態鏈結庫

dll程式設計學習 首先要知道,在vc 6.0環境中,在c呼叫約定和c編譯環境下使用 declspec dllexport 關鍵字可以匯出不帶任何修飾符的函式名。dll函式的約定有兩種 呼叫約定和函式名修飾約定。呼叫約定又分為 stdcall呼叫約定,cdecl c呼叫約定 和 fastcall呼叫...