青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

cyt
VC里面實(shí)現(xiàn)動(dòng)態(tài)對(duì)象載入已經(jīng)不是什么新鮮事情了,很多的plug-in技術(shù)就是例子。Unix下,通過(guò)動(dòng)態(tài)載入so獲得一個(gè)對(duì)象也不是什么難事,不過(guò)對(duì)這個(gè)對(duì)象的管理就是一件比較麻煩的事情了。一般的需求如下:
??有class TMyObj,準(zhǔn)確說(shuō)TMyObj應(yīng)該是一個(gè)接口,根據(jù)不同具體情況會(huì)有不同的實(shí)現(xiàn),例如 TMyObj1、TMyObj2等等……而這些TMyObj1和TMyObj2分別保存在不同的so當(dāng)中,需要根據(jù)不同的時(shí)候load不同的so,建立相應(yīng)的對(duì)象。由于這些對(duì)象都擁有TMyObj的接口,所以對(duì)于外部來(lái)說(shuō)對(duì)這些類(lèi)的使用就像對(duì)TMyObj的使用一樣。
??看起來(lái)好像比較簡(jiǎn)單,只要在so里面引出一個(gè)函數(shù):
??TMyObj * onCreateObject(void);
??而函數(shù)在so中的具體實(shí)現(xiàn)就是建立不同的子類(lèi),例如在obj1.so中:
??TMyObj * onCreateObject(void)
???{?return new TMyObj1;?}
??使用的時(shí)候只需要?jiǎng)討B(tài)load入obj1.so,并且找到onCreateObject函數(shù)的入口,就可以建立一個(gè)具有TMyObj接口的TMyObj1了。
??至于釋放對(duì)象,一般有兩種方法:
方法一:
??so中包含另外一個(gè)函數(shù):
??void onDestroyObj(void * p)
??{
????TMyObj1 * tp = (TMyObj1 *)p;
????delete tp;
??}
??從so中導(dǎo)出該函數(shù),并在刪除對(duì)象的時(shí)候調(diào)用。
方法二:
??TMyObj的析構(gòu)函數(shù)聲明為虛函數(shù),那么從so導(dǎo)出的onCreateObject()建立的對(duì)象,直接執(zhí)行delete刪除就行了,由于析構(gòu)函數(shù)是虛函數(shù),編譯器會(huì)正確的調(diào)用TMyObj1的析構(gòu)函數(shù)。
??當(dāng)然,方法二是比較簡(jiǎn)單而優(yōu)雅的方法,既然對(duì)于C++來(lái)說(shuō)接口就相當(dāng)于純虛函數(shù),多增加一個(gè)析構(gòu)的虛函數(shù)又何妨呢。但是無(wú)論使用哪種方法,都要注意一個(gè)問(wèn)題,就是載入的obj1.so的生命周期要比最后一個(gè)TMyObj1的生存周期長(zhǎng)。即只要內(nèi)存中還存在TMyObj1對(duì)象,obj1.so就要一直在內(nèi)存中,不能卸載。要保證這個(gè)同步,是比較麻煩的事情。下面就說(shuō)說(shuō)我的解決方法:
??
??首先,要選擇一個(gè)通用的載入so的lib,這個(gè)可以參考一下common c++的DSO(在file.h)里面。(不想使用common c++?我也只是說(shuō)“參考”而已)。這個(gè)支持DLL和so,通過(guò)成員函數(shù)void *operator[](const char *);獲得指定的symbol的入口。
??其次,就要選擇一個(gè)通用的SmartPtr。這個(gè)當(dāng)然Loki是首選,Loki的SmartPtr的靈活性比boost的smart_ptr強(qiáng)多了,而且Loki也小巧的多。
??然后就要實(shí)現(xiàn)一個(gè)簡(jiǎn)單的so的manager,其實(shí)應(yīng)該說(shuō)是一個(gè)動(dòng)態(tài)object的factory:
??class TObjFactory : protected DSO
??{
??public:
????TObjFactory(void);
????
????void?load(const std::string & strPath);
????void *?createObj(void) const throw (TSOException);
??protected:
????typedef void * (*funcCreate)(void ** p);
????funcCreate??m_pCreator;
??};
??可以想象這個(gè)類(lèi)干些什么:load就是載入相應(yīng)的so,然后獲得so中onCreateObject函數(shù)的入口,并賦給成員m_pCreator。而createObj就是調(diào)用m_pCreator建立對(duì)象。不過(guò)有所不同的是 m_pCreator所指向的函數(shù)形式是void * funcCreate(void ** p),而多出來(lái)void **p用處就是可以讓so中的構(gòu)造函數(shù)中產(chǎn)生的exception能夠傳遞出來(lái)。這個(gè)不能說(shuō)不是so的麻煩之處,so中函數(shù)的exception不能被外部捕獲,所以只好這樣子做了。
??現(xiàn)在,關(guān)鍵的地方來(lái)了,就是要保證這個(gè)TObjFactory的生存周期了。選擇Loki的SmartPtr就能派上用場(chǎng)了。
??Loki的SmartPtr可以自己選定適用的StoragePolicy,這正是我們需要的,參考DefaultSPStorage,可以做我們的TMySOStoragePolicy:
??template
???class TMySOStoragePolicy
???{
????.....
???protected:
????void Destroy()
??????? {
??????? ?delete pointee_;
??????? ?m_pFactory = SmartPtr();
??????? }???
???private:
????SmartPtr?m_pFactory;
????StoredType ??????pointee_;
???};
??顯而易見(jiàn),這樣做的目的就是要保證釋放指針的時(shí)候就減少TObjFactory的引用計(jì)數(shù)。
??好了,現(xiàn)在就是主角了:
??template
??class TDObj : public SmartPtr
??{
??public:
????TDObj(void);
????TDObj(const TDObj & obj);
????.....
????
??protected:
????friend class TDObjManager;
????TDObj(T * p, SmartPtr pManager);
??};
??
??class TDObjManager
??{
??public:
????......
????template
?????static TDObj??createObj(const std::string & strKeyName)
?????{
???????SmartPtr pFactory = getFactoryByName(strKeyName);
???????//這里面可以做很多事情了,例如訪問(wèn)內(nèi)存,查找相應(yīng)的Factory;或者讀取配置文件、讀入新的so并建立新的Factory。
???????//或者根據(jù)一些淘汰算法,先淘汰內(nèi)存的Factory,然后重新載入新的Factory等等。
???????std::auto_ptr _au( static_cast(pFactory->createObj()) );
???????return TDObj( _au.release(), pFactory);
?????}
??};
??
??以后用起來(lái)就簡(jiǎn)單多了:
??class TMyObj
??{
??public:
???virtual ~TMyObj(void);
???virtual int func(void) = 0;
??};
??
??TDObj?obj1 = TDObjManager::createObj( "obj1.so") );
??TDObj?obj2 = TDObjManager::createObj( "obj2.so") );
??
??cout << obj1->func() << endl;
??cout << obj2->func() << endl;

??說(shuō)了這么久,都是主程序的調(diào)用,而so中應(yīng)該如何呢?其實(shí)也很簡(jiǎn)單:
??class TMyObj1 : public TMyObj
??{
??public:
????TMyObj1(void);
????~TMyObj1(void);

????static void?onStaticInit(void);
????static void?onStaticDestroy(void);
????static const char *?getVersion(void);
????static const char *?getObjectName(void);
????
????virtual int??func(void);
??};
??
??DECLARE_SO_INTERFACE(TMyObj1);
??
??DECLARE_SO_INTERFACE其實(shí)是一個(gè)為了方便編寫(xiě)程序而定義的宏:
??#define DECLARE_SO_INTERFACE(x)?extern "C" {?\
????void onInstallDLL(void);???\
????void onUninstallDLL(void);???\
????const char * onGetVersion(void);?\
????const char * onObjectName(void);?\
????void *?onCreateObject(void ** ppException);??\
???}; \
???void?onInstallDLL(void)?{ x::onStaticInit(); }????\
???void?onUninstallDLL(void)?{ x::onStaticDestroy(); }??\
???const char * onGetVersion(void) { return x::getVersion(); }??\
???const char * onObjectName(void)?{ return x::getObjectName(); }?\
???void *?onCreateObject(void ** pException)?{?\
????try { \
?????*pException = NULL; x * p = new x();?return (void *)p; \
????}catch(std::exception & e) { \
?????*pException = new std::exception(e); \
?????return NULL; ?\
????}?\
???}
???
??可以看到除了導(dǎo)出onCreateObject函數(shù)以外,還導(dǎo)出了:
??TMyObj1::onStaticInit用于載入so的時(shí)候執(zhí)行初始化操作;
??TMyObj1::onStaticDestroy用于卸載so的時(shí)候執(zhí)行清理操作;
??TMyObj1::getVersion?獲得對(duì)象的版本信息
??TMyObj1::onObjectName 獲得對(duì)象名信息等
??可以擴(kuò)展前面的TObjFactory,實(shí)現(xiàn)這些功能。

??同理,我們可以做obj2.so:
??class TMyObj2 : public TMyObj
??{
??public:
???TMyObj2(void);
???~TMyObj2(void);
??
???static void?onStaticInit(void);
???static void?onStaticDestroy(void);
???static const char *?getVersion(void);
???static const char *?getObjectName(void);
??
???virtual int??func(void);
??};
??
??DECLARE_SO_INTERFACE(TMyObj2);
??
??
??另外,一個(gè)值得討論的問(wèn)題是:C++由于沒(méi)有反射機(jī)制,所以無(wú)法實(shí)現(xiàn)設(shè)值注入和構(gòu)造注入,只能實(shí)現(xiàn)接口注入。不過(guò)一般來(lái)說(shuō)也已經(jīng)足夠使用了。

posted on 2005-10-08 14:51 cyt 閱讀(1293) 評(píng)論(2)  編輯 收藏 引用
Comments

只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲精品系列| 欧美另类高清视频在线| av成人免费| 久久精品一本| 欧美一区二区成人6969| 欧美精品一区二区三| 免费亚洲电影在线| 国产亚洲视频在线观看| 亚洲一级黄色片| 亚洲一区bb| 欧美精品一区二区三区高清aⅴ| 久久夜色精品一区| 国产午夜精品在线| 亚洲欧美日韩精品久久久| 亚洲一区二区免费视频| 欧美精品免费视频| 亚洲国产美女久久久久| 亚洲国产经典视频| 另类综合日韩欧美亚洲| 免费成人高清在线视频| 激情欧美日韩| 久久米奇亚洲| 欧美a级在线| 亚洲国产精品999| 美女脱光内衣内裤视频久久网站| 久久视频在线视频| 亚洲大胆视频| 欧美成人一区二区| 亚洲精品1区| 在线亚洲精品| 国产精品美女久久久| 亚洲欧美在线网| 久久久久99精品国产片| 永久免费视频成人| 欧美a级片网| 亚洲精品影视在线观看| 亚洲一区二区三区中文字幕在线| 欧美体内谢she精2性欧美| 亚洲午夜小视频| 欧美亚洲视频在线观看| 国产一区二区在线免费观看| 久久久青草青青国产亚洲免观| 久久这里只精品最新地址| 亚洲成色精品| 欧美日韩三区四区| 亚洲欧美日韩国产综合| 久久综合狠狠| 亚洲人成网站色ww在线| 欧美日韩性视频在线| 亚洲线精品一区二区三区八戒| 欧美一区亚洲| 亚洲高清自拍| 欧美三日本三级少妇三99| 亚洲欧美国产另类| 欧美高清hd18日本| 亚洲免费在线电影| 精品88久久久久88久久久| 欧美精品久久一区| 欧美一级成年大片在线观看| 欧美成人精品三级在线观看 | 激情久久综合| 欧美久久久久久久久| 亚洲免费在线电影| 欧美黑人在线观看| 欧美一区二区三区久久精品| 亚洲高清视频一区| 国产精品美女久久福利网站| 久久天天躁夜夜躁狠狠躁2022| 亚洲精品视频一区| 老司机亚洲精品| 亚洲一区二区三| 亚洲电影第1页| 国产精品日韩一区| 欧美69wwwcom| 久久电影一区| 亚洲视频一区二区| 亚洲欧洲日产国产综合网| 久久久久高清| 亚洲欧美成人一区二区三区| 亚洲欧洲偷拍精品| 国产中文一区二区| 国产精品亚洲一区| 欧美日韩高清在线播放| 久久视频国产精品免费视频在线 | 欧美中文字幕在线观看| 日韩亚洲欧美在线观看| 欧美承认网站| 久久免费高清视频| 欧美一级视频免费在线观看| 一本色道久久综合亚洲精品不卡 | 国内精品久久久久久| 国产精品国产三级国产aⅴ入口| 欧美高清视频一区| 久久野战av| 久久亚洲不卡| 久久精品视频在线免费观看| 午夜视频一区在线观看| 国产精品99久久久久久有的能看| 亚洲国产老妈| 亚洲国产aⅴ天堂久久| 免费不卡亚洲欧美| 美女视频黄免费的久久| 久久久之久亚州精品露出| 性欧美1819性猛交| 亚洲在线黄色| 午夜精品三级视频福利| 亚洲自拍啪啪| 午夜精品美女久久久久av福利| 亚洲视频一区在线观看| 亚洲一区二区三区777| 亚洲一区二区三区四区中文 | 日韩视频中午一区| 日韩午夜一区| 一区二区三区免费观看| 日韩亚洲欧美一区| 一区二区三区成人| 亚洲午夜激情免费视频| 亚洲免费视频在线观看| 性做久久久久久免费观看欧美| 亚洲一区二区成人在线观看| 亚洲欧美国产精品桃花| 性做久久久久久久免费看| 欧美中文在线观看| 老司机凹凸av亚洲导航| 欧美护士18xxxxhd| 欧美午夜免费影院| 国产免费亚洲高清| 1024欧美极品| 一本不卡影院| 欧美一区中文字幕| 狂野欧美激情性xxxx欧美| 欧美激情精品久久久久久蜜臀| 亚洲国产精品专区久久| 亚洲午夜视频在线| 久久精品午夜| 欧美精品在线视频| 国产精品亚洲激情| 1024亚洲| 亚洲中字在线| 久久久久这里只有精品| 亚洲国产日韩一区二区| 亚洲午夜av电影| 久久九九99视频| 欧美激情在线有限公司| 国产精品免费aⅴ片在线观看| 激情欧美一区二区| 宅男精品导航| 久久婷婷国产综合尤物精品| 亚洲欧洲三级电影| 欧美一区二区三区免费看| 欧美激情精品久久久久久免费印度| 欧美日韩亚洲高清一区二区| 黄色av日韩| 亚洲视频在线观看免费| 蜜臀久久久99精品久久久久久| 日韩网站免费观看| 久久精品夜色噜噜亚洲a∨| 欧美日韩精品免费观看视频完整| 国产一区二区三区成人欧美日韩在线观看| 亚洲国产另类 国产精品国产免费| 亚洲综合国产精品| 亚洲日本精品国产第一区| 午夜老司机精品| 欧美视频国产精品| 亚洲日本欧美| 久久亚洲一区二区| 亚洲综合视频1区| 欧美日韩国产在线| 亚洲国产精品一区二区三区| 午夜欧美大尺度福利影院在线看| 亚洲激情视频网| 久久久久国产精品一区二区| 国产精品影视天天线| 一个人看的www久久| 欧美高清在线视频| 久久av一区二区三区漫画| 国产精品毛片在线| 一区二区三区国产在线观看| 欧美国产日韩一区| 久久青青草原一区二区| 国产一区二区av| 欧美在线一级视频| 亚洲制服av| 国产精品一区二区久久| 亚洲影院免费| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 欧美一区二区三区久久精品| 亚洲美女淫视频| 欧美精品日韩一区| 亚洲精品美女久久7777777| 蜜臀99久久精品久久久久久软件 | 欧美日韩精品一区二区在线播放| 亚洲国产精品va| 欧美激情第9页| 免费久久99精品国产自在现线| 尤物九九久久国产精品的分类| 久久精品视频va| 欧美一区二区视频网站| 韩国久久久久| 欧美成人精品高清在线播放|