看到一篇文章,覺得比較有指導意義,譯過來,希望給大家有些幫助,能力有限,有錯誤的地方還望大家指出來。共同學習,共同進步。
3 特性
擴充套件類不包含許可權設定,它的許可權級別繼承于父應用,例如:如果某應用使用了乙個具有檔案操作功能的擴充套件類,那麼該應用就是擴充套件類的父應用,除非父應用的mif檔案中設定了允許檔案操作的許可權,否則該擴充套件類的所有檔案操作都會失敗,這一點對於擴充套件來開發人員來說十分重要。
與許可權級別相似的是,擴充套件類中所有對於檔案的操作都是通過父應用的上下文來執行的,如此來看,對於父應用不可見的檔案,擴充套件類也是無法操作的。
擴充套件類即可以是保護型別也可以是未保護型別。對於保護型別來說,如果父應用的mif檔案中的依存關係列表中有顯示羅列出該擴充套件類,那麼父應用就可以建立並使用它,反之,則不行;對於非保護型別則可以被所有應用使用,不用考慮該應用是否明確宣告了依存關係,這樣的擴充套件類通常被加上乙個mime型別的標記,應用只需要通過外殼查詢目標mime型別的控制代碼,就可以使用它的功能了。
5 宣告擴充套件類的結構體
第一步,開發擴充套件類首先需要宣告虛函式表。
typedef struct idemoextension idemoextension;
aeeinte***ce(idemoextension)
;以上**的第一行把虛函式表插入了擴充套件類的結構體定義之中,虛函式表必須總是被定義成為結構體的第乙個成員,m_nrefs變數也必須在結構體定義中宣告,乙個擴充套件類在應用中將會數次被引用,這個變數用來儲存在應用中被引用的總次數,addref和release函式是用來對該變數進行增減操作的,一旦m_nrefs變為0,該擴充套件類就會釋放所有占用的資源。結構體中接下來的三個成員是擴充套件類的可選成員,可以在擴充套件類中新增任何所需要的成員變數。
6 定義函式
定義的第乙個函式必須是aeeclscreateinstance,rew總是呼叫該函式來建立該class的介面,下面的**表明了普遍實現的方法。
int aeeclscreateinstance(aeeclsid clsid, ishell *pishell,
imodule *po, void **ppobj)
return efailed;
}我們的函式首先會檢查由brew傳入的引數class id,如果檢查通過了,函式就嘗試建立和初始化需要的資源。
addref, release和queryinte***ce是從iqi介面繼承過來的,addref負責增加引用計數的數值。
static uint32 myextension_addref(idemoextension* pme)
release函式負責減少引用計數的數值,當引用計數的值變為0的時候,該例項就會從記憶體中被釋放掉。
static uint32 myextension_release(idemoextension* pme)
我們最後乙個需要定義的函式就是queryinte***ce,這個函式返回乙個與擴充套件類相關聯的介面,iweb介面就是乙個例子,當乙個應用使用該介面完成乙個網頁請求的時候,底層的乙個tcp套接字被建立,為了能夠直接控制這個套接字,應用可以通過呼叫iweb_queryinte***ce函式,傳遞引數aeeclsid_socket(aeeclsid_sockport在brew3.x中),來獲得這個介面,該函式將返回乙個指標,下面是queryinte***ce的乙個具體實現。
static int myextension_queryinte***ce(idemoextension* me,
aeeclsid class, void** ppo)
}7 靜態擴充套件類
上面介紹的這個例子也可以用來建立靜態擴充套件類,然而靜態擴充套件類可以作為全域性變數,有了這個特性,下面的**可以為靜態擴充套件類構造虛函式表。
static const aeevtbl(idemoextension) gvtidemoextension = ;
以上的**被放置在函式之外,通常是在乙個標頭檔案中,初始化擴充套件類可以簡單的用一行**搞定。
pme->pvt = &gvtidemoextension;
上面的**初始化了整個虛函式表,不必對於虛函式表中每個函式都初始化一次,然而上面的**僅對靜態擴充套件類是有效的,乙個動態擴充套件類的位址是在執行時確定的(於之不同的是,靜態擴充套件類的位址是在編譯時確定的),因此,虛函式表必須在執行時宣告。
8 關於巨集
強烈推薦在以上例子中所使用到的巨集,然而在brew中還有許多其他的可以用來建立擴充套件類的巨集。其中很多巨集被包含近來是為了向後的相容性,一些巨集例如:qinte***ce, get_pvtbl和declare_ibase都是十分令人氣餒的,他們應該分別被aeeinte***ce, aeegetpvtbl和inherit_iqueryinte***ce替代。
9 使用擴充套件類
擴充套件類可以像標準的brew apis一樣被建立和釋放,每個函式都可以通過標頭檔案的巨集定義來呼叫,同brew apis一樣,在編譯呼叫擴充套件類函式的應用的時候需要包含其標頭檔案,下面的例子敘述了如何在應用中呼叫擴充套件類的函式。
if(ishell_createinstance(pme->a.m_pishell, aeeclsid_myextension,
(void **) (&(pme->pidemoextension))) != success )
idemoextension_displaytime(pme->pidemoextension);
if(pme->pidemoextension)
10 通過mime型別使用擴充套件類
擴充套件類可以把其自身註冊為乙個mime型別的控制代碼,它的註冊最好通過mif編輯器來完成。
上面提及的例子展示了乙個擴充套件類註冊為mytime控制代碼,mime型別的註冊允許在執行時解決class id的問題,應用可以通過ishell_gethandler函式找到乙個mime型別的class id,整個函式會遍歷所有的mif檔案,尋找以mime型別方式註冊的class id。
下面這個例子闡述了一段能建立和顯示多種不同格式檔案的**,在此例中,有乙個抽象類ireader,乙個擴充套件類可以擴充它的介面來顯示多種格式的檔案。
// ishell createinstance
// each extension implements displayfile, the virtual
// table will point to the correct corresponding function
// call. we are ignoring error checking
ireader_displayfile(pme->pireader, file);
}displayfile是乙個被所有擴充套件類實現的擴充ireader的介面,虛函式表在建立擴充套件類的時候被初始化,這樣就使ireader_displayfile可以索引正確的函式來顯示檔案。
11 更多資訊
brew 2.x 察看aee.h
brew 3.x 察看aeeinte***ce.h
BREW擴充套件類開發
擴充套件類應用從所有者的角度可以分為兩種 公有擴充套件類和私有擴充套件類。公有擴充套件類由開發商開發和擁有,提供給其他開發使用並收費。私有擴充套件類可以由開發商開發和擁有,供給自己的乙個或多個應用使用,與其他應用共享收益 也可以由運營商開發和擁有,由運營商發布,提供給開發商或合作夥伴使用 還可以由手...
brew安裝php和擴充套件
brew install homebrew php php56 with apache 報錯 checking if the location of zlib install directory is defined.no configure error cannot find libz 解決 xc...
php擴充套件類開發例項
1 class vector2d214 15 16 generates a copy of this vector.17 return vector2d a copy of this vector.18 19public function mycopy 2023 24 25 sets this ve...