專利名稱:一種命名服務(wù)機(jī)制的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種命名服務(wù)機(jī)制,尤其是一種通過(guò)字符串與命名服務(wù)對(duì)象的對(duì)應(yīng)關(guān)系來(lái)找到組件對(duì)象的命名服務(wù)機(jī)制。
背景技術(shù):
零部件動(dòng)態(tài)裝配(Component Assembly Runtime,簡(jiǎn)稱CAR),是一種構(gòu)件技術(shù)。CAR構(gòu)件技術(shù)是面向構(gòu)件編程的編程模型,它規(guī)定了一組構(gòu)件間相互調(diào)用的標(biāo)準(zhǔn),使得二進(jìn)制構(gòu)件能夠自描述,能夠在運(yùn)行時(shí)動(dòng)態(tài)鏈接。
CAR與微軟的組合對(duì)象模型(Component Object Model,簡(jiǎn)稱COM)類似,但是和微軟COM相比,CAR刪除了COM中過(guò)時(shí)的約定,禁止用戶定義COM的非自描述接口;完備了構(gòu)件及其接口的自描述功能,實(shí)現(xiàn)了對(duì)COM的擴(kuò)展;對(duì)COM的用戶界面進(jìn)行了簡(jiǎn)化包裝,易學(xué)易用。
從上面的定義中,我們可以說(shuō)CAR是微軟COM的一個(gè)子集,同時(shí)又對(duì)微軟的COM進(jìn)行了擴(kuò)展,在軟件開(kāi)發(fā)工具包(Software Development Kits,簡(jiǎn)稱SDK)的支持下,使得高深難懂的構(gòu)件編程技術(shù)很容易被C/C++程序員理解并掌握。
命名服務(wù)是CAR體系里面的一項(xiàng)重要技術(shù),CAR體系的組件實(shí)現(xiàn)了較為完善的自描敘功能,其有一套成熟的可以穿透不同機(jī)器,進(jìn)程以及其它不同訪問(wèn)限制空間的組件交互技術(shù)。命名服務(wù)在該體系中擔(dān)當(dāng)了一種發(fā)布,發(fā)現(xiàn)并獲得組件服務(wù)的策略機(jī)制。
現(xiàn)有的命名機(jī)制類同于微軟COM的名字對(duì)象機(jī)制COM的名字對(duì)象機(jī)制,是一種標(biāo)準(zhǔn)的,可以把任意的對(duì)象名字解析到這些名字所引用的對(duì)象上的方式。其支持三種激活方式綁定到類對(duì)象,綁定到新的類實(shí)例,以及綁定到保存在文件中的永久對(duì)象。下面介紹相應(yīng)的各個(gè)過(guò)程的C++代碼實(shí)現(xiàn)1、綁定到類對(duì)象//本例通過(guò)獲得一個(gè)大猩猩的類對(duì)象,然后通過(guò)其創(chuàng)建一個(gè)類實(shí)例IclassFactory*pcf=0;//聲明Gorilla的CLSID為顯示名const OLECHAR pwsz[]= OLESTR(″clsid571F1680-CC93-1100-2000-001223113344″);//通過(guò)Gorilla的類名字對(duì)象尋找類對(duì)象HRESULT hr=CoGetObject(pwsz,0,IID_IclassFactory, (void**)&pcf);if(SUCCEEDED(hr)){IApe*pApe=0;//使用類對(duì)象創(chuàng)建Gorillahr=pcf-> CreateInstance(0,IID_IApe,(void**)&pApe);......
}2、綁定到類實(shí)例//本例通過(guò)獲得一個(gè)命名的類實(shí)例IApe*rpApe;HRESULT hr;//類對(duì)象名(clsid)和類實(shí)例名(Ursus)的組合const OLECHAR pwsz[]= OLESTR( ″clsid:571F1680-CC93-1100-2000-001223113344:!Ursus″);hr=CoGetObject(pwsz,0,IID_IApe,(void**)&rpApe);3、綁定到保存在文件中的永久對(duì)象//本例獲得一個(gè)保存在文件中的類實(shí)例IApe*rpApe;HRESULT hr;//文件的路徑和文件名OLECHAR pwszObject[]= OLESTR(″ server public cornelius.chmp″);hr=CoGetObject(pwszObject,0, IID_IApe,(void**)&rpApe);
因此,從上可以看出,微軟的名字對(duì)象對(duì)外提供了統(tǒng)一的接口函數(shù)獲得對(duì)象函數(shù)(CoGetObject)。但從CoGetObject的實(shí)現(xiàn)來(lái)看,它將創(chuàng)建對(duì)象本身與綁定名字兩個(gè)過(guò)程合在一起,也就是說(shuō)當(dāng)不存在字符串所指定的對(duì)象或者實(shí)例的時(shí)候,它將創(chuàng)建一個(gè)對(duì)應(yīng)的新的對(duì)象或者實(shí)例來(lái)滿足用戶的要求。用戶也無(wú)法自己指定特定的類實(shí)例進(jìn)行綁定。而對(duì)于綁定類對(duì)象來(lái)說(shuō),COM規(guī)定組件的類對(duì)象必須實(shí)現(xiàn)解析顯示命名(IparseDisplayName)接口才能使用名字對(duì)象綁定類對(duì)象的功能;對(duì)于綁定到保存在文件中的永久對(duì)象,則組件本身必須實(shí)現(xiàn)永久文件(IPersistFile)接口,名字對(duì)象機(jī)制的使用對(duì)組件本身的實(shí)現(xiàn)有限制和需求。它也不支持將一個(gè)遠(yuǎn)程接口代理和字符串綁定的功能。
發(fā)明內(nèi)容
本發(fā)明的目的是提供一種命名服務(wù)機(jī)制,支持遠(yuǎn)程接口代理,可以實(shí)現(xiàn)字符串與對(duì)象的綁定,而且允許將任意接口代理與字符串綁定,從而達(dá)到組件服務(wù)與提供命名服務(wù)可以不為同一用戶的能力,更有利于組件服務(wù)的分發(fā)和使用。
為實(shí)現(xiàn)上述目的,本發(fā)明提供了一種命名服務(wù)機(jī)制,包括以下步驟步驟1、服務(wù)端進(jìn)程獲得一個(gè)組件對(duì)象的指針;步驟2、服務(wù)端進(jìn)程將獲得的組件對(duì)象的指針與一個(gè)字符串綁定,并注冊(cè)到內(nèi)核,獲得組件對(duì)象在內(nèi)核的注冊(cè)信息對(duì)象,內(nèi)核創(chuàng)建一個(gè)代表命名服務(wù)的命名服務(wù)對(duì)象,并將命名服務(wù)對(duì)象以所述字符串為標(biāo)志與注冊(cè)信息對(duì)象綁定;步驟3、客戶端進(jìn)程利用所述字符串查詢獲得所述命名服務(wù)對(duì)象;步驟4、客戶端進(jìn)程找到綁定的所述字符串對(duì)應(yīng)的注冊(cè)信息對(duì)象;步驟5、客戶端進(jìn)程通過(guò)所述注冊(cè)信息對(duì)象和字符串找到組件對(duì)象的指針。
在所述步驟5之后還包括步驟6、客戶端進(jìn)程利用所獲得的組件對(duì)象的接口指針調(diào)用組件方法;步驟7、客戶端進(jìn)程釋放所述組件對(duì)象接口指針,通知服務(wù)端進(jìn)程。
所述步驟7之后還具有以下步驟步驟8、服務(wù)端進(jìn)程注銷所述命名服務(wù)對(duì)象;步驟9、服務(wù)端進(jìn)程釋放所述組件對(duì)象的接口指針。
因此,本發(fā)明命名服務(wù)機(jī)制,可以支持遠(yuǎn)程接口代理,可以實(shí)現(xiàn)字符串與對(duì)象的綁定,而且允許將任意接口代理與字符串綁定,從而達(dá)到了組件服務(wù)與提供命名服務(wù)可以不為同一用戶的能力,更有利于組件服務(wù)的分發(fā)和使用。即通過(guò)用字符串的方式向外發(fā)布組件,而異空間的其它用戶則可以通過(guò)命名服務(wù)獲取組件服務(wù)。用戶和內(nèi)核都可以創(chuàng)建一個(gè)命名服務(wù),其它用戶可以透明的獲得該用戶指針,而無(wú)需考慮其所在位置空間的不同。命名服務(wù)server端獲得的組件指針代表的可以是其server進(jìn)程內(nèi)空間創(chuàng)建并運(yùn)行的組件,亦可以是一種基于CAR構(gòu)件技術(shù)的嵌入式操作系統(tǒng)內(nèi)核提供的以接口形式提供的內(nèi)核功能,也可以是server端所獲得的其它進(jìn)程所實(shí)現(xiàn)的組件服務(wù)。相關(guān)組件服務(wù)動(dòng)態(tài)更新或者升級(jí),不影響其它通過(guò)命名服務(wù)獲取該服務(wù)的程序,其依然可以無(wú)需改動(dòng),無(wú)需重新編譯地正常工作。
下面結(jié)合附圖和實(shí)施例,對(duì)本發(fā)明的技術(shù)方案做進(jìn)一步的詳細(xì)描述。
圖1為本發(fā)明命名服務(wù)機(jī)制的方法流程圖。
圖2為本發(fā)明命名服務(wù)機(jī)制EzFindService API函數(shù)的實(shí)現(xiàn)流程圖。
具體實(shí)施例方式
本發(fā)明的思想是設(shè)計(jì)一種以字符串為標(biāo)識(shí)的服務(wù)。服務(wù)程序可以通過(guò)操作系統(tǒng)API函數(shù)注冊(cè)服務(wù)函數(shù)(EzRegisterService)向操作系統(tǒng)注冊(cè)自己的服務(wù)接口,而服務(wù)的使用者(即客戶端程序)則可以通過(guò)API函數(shù)獲取服務(wù)函數(shù)(EzFindService)來(lái)獲取指定的服務(wù)接口。命名服務(wù)通過(guò)簡(jiǎn)單,友好的系統(tǒng)API函數(shù),為系統(tǒng)服務(wù)以及用戶組件提供了一套完整的CAR構(gòu)件使用流程,具有良好的擴(kuò)展性,并支持基于組件的動(dòng)態(tài)更新和升級(jí)。
命名服務(wù)機(jī)制屬于CAR構(gòu)件技術(shù)的一部分,CAR構(gòu)件技術(shù)通過(guò)命名服務(wù)機(jī)制提供一種發(fā)布,獲取,使用CAR構(gòu)件的方法,命名服務(wù)隸屬于CAR構(gòu)件技術(shù)的用戶接口部分。
首先,我們實(shí)現(xiàn)一個(gè)簡(jiǎn)單的動(dòng)態(tài)鏈接文件(Dynamic Link Library,簡(jiǎn)稱dll)形式的CAR組件服務(wù),主要C++代碼如下在hello.car文件中組件,實(shí)現(xiàn)類、接口,以及方法的聲明表示如下[version(1.0),uuid(e363b985-8a3a-40a6-b88c-b2e10274fe54),uunm(www.koretide.com/ezcom/hello.dll)]component Hello//組件Hello{[uuid(70f1f7e4-1b9b-4e74-8c1b-fdc2fefblce1)]interface IHello{//接口IHelloHRESULT Hello([in]EzStr inStr);//方法Hello}[uuid(3d19bc4c-b2c7-4ea5-8409-63db930adlb7)]class CHello{//實(shí)現(xiàn)類CHellointerface IHello;}}在chello.h以及chello.cpp文件中聲明了C++類型的CHello對(duì)象,并實(shí)現(xiàn)接口方法Hello。
chello.h文件中主要C++代碼表示如下class CHello:public_CHello//CHello定義{public:
STDMETHODIMP Hello(/*[in]*/EzStr inStr);};chello.cpp文件中主要C++代碼表示如下
DECLARE_ LASSFACTORY(CHello)//聲明類廠HREsULT CHello::Hello(//Hello方法的實(shí)現(xiàn)代碼/*[in]*/EzStr inStr){printf(″%S n″,(wchar_t★)inStr) ;return S_OK;}在server.cpp中,我們將創(chuàng)建一個(gè)Hello的本地組件,并將其注冊(cè)為以字符串“ hello”為標(biāo)志的命名服務(wù)對(duì)象,然后我們通過(guò)系統(tǒng)API函數(shù)創(chuàng)建事件(EzCreateEvent)獲取一個(gè)內(nèi)核Event對(duì)象服務(wù),并將其注冊(cè)為“event”為標(biāo)志的命名服務(wù),服務(wù)使用完畢,注銷服務(wù),并釋放相關(guān)資源。程序主要C++代碼如下CHelloRef cHello;//聲明接口智能指針I(yè)Event★pEvent;//聲明Event接口指針//在本進(jìn)程空間內(nèi)創(chuàng)建一個(gè)Hello組件HRESULT hr=cHello.Instantiate();if(FAILED(hr)){……}//注冊(cè)命名服務(wù),將CHello構(gòu)件與字符串“hello”綁定hr=EzRegisterService(EZCSTR(″hello″), (IHello★)(cHello);if(FAILED(hr)){……}//通過(guò)API函數(shù)獲得一個(gè)內(nèi)核Event對(duì)象服務(wù)hr=EzCreateEvent(true,false,&pEvent);if(FAILED(hr)){……}//注冊(cè)命名服務(wù),將Event構(gòu)件與字符串“event”綁定hr=EzRegisterService(EZCSTR(″e(cuò)vent″),pEvent);if(FAILED(hr)){……}//讓該進(jìn)程等待pEvent->Wait(NULL);
//被其它進(jìn)程喚醒,等待結(jié)束,注銷服務(wù),釋放資源EzUnregisterService(EZCSTR(″e(cuò)vent″));//注銷Event服務(wù)pEvent->Release();//釋放pEevent指針//cHello為對(duì)象智能指針,所以程序退出,它會(huì)自動(dòng)釋放對(duì)象資源EzUnregisterService(EZCSTR(″hello″));//注銷hello服務(wù)在client.cpp中,我們將通過(guò)EzFindService函數(shù)使用以字符串“hello”以及“event”為標(biāo)志的命名服務(wù)對(duì)象,通過(guò)命名服務(wù)對(duì)象,我們找到與命名服務(wù)對(duì)象的名字綁定的相關(guān)組件服務(wù),并進(jìn)行調(diào)用,調(diào)用完釋放掉相關(guān)的組件服務(wù)指針。主要C++代碼如下IHello*pIHello;//聲明一個(gè)IHello接口指針I(yè)Event*pIEvent;//聲明一個(gè)IEvent接口指針HRESULT hr;//通過(guò)字符串“hello”找到相關(guān)組件服務(wù)hr=EzFindService(EZCSTR(″hello″),&pIHello);if(FAILED(hr)){……}//遠(yuǎn)程調(diào)用Hello方法,打印″hello,world″pIHello->Hello(EZCSTR(″hello,world″));pIHello->Release();//釋放獲取的IHello接口指針//通過(guò)字符串“event”找到相關(guān)組件服務(wù)hr=EzFindService(EZCSTR(″e(cuò)vent″),&pIEvent);if(FAILED(hr)){……}//通過(guò)notify方法喚醒server進(jìn)程pIEvent->Notify(0);pIEvent->Release();//釋放獲取的IEvent接口指針上述實(shí)施例流程圖如圖1所示,步驟1、服務(wù)端進(jìn)程獲得一個(gè)組件Hello的指針;本進(jìn)程空間內(nèi)創(chuàng)建一個(gè)Hello組件;通過(guò)EzCreateEvent API函數(shù)獲得一個(gè)內(nèi)核Event對(duì)象服務(wù),步驟2、服務(wù)端進(jìn)程將創(chuàng)建的組件對(duì)象Hello與一個(gè)字符串“Hello”綁定,并注冊(cè)到內(nèi)核,獲得組件對(duì)象在內(nèi)核的注冊(cè)信息對(duì)象,內(nèi)核創(chuàng)建一個(gè)代表命名服務(wù)的命名服務(wù)對(duì)象NameHook,并將命名服務(wù)對(duì)象NameHook以字符串“Hello”為標(biāo)志與注冊(cè)信息對(duì)象綁定;并注冊(cè)為“event”為標(biāo)志的命名服務(wù);即Server程序裝載組件,注冊(cè)成功以“hello”,“event”為標(biāo)志的命名服務(wù);步驟3、客戶端進(jìn)程利用字符串“hello”查詢找到相關(guān)的組件命名服務(wù)對(duì)象NameHook;步驟4、客戶端進(jìn)程找到綁定的注冊(cè)信息對(duì)象Object;步驟5、客戶端進(jìn)程通過(guò)注冊(cè)信息對(duì)象和字符串“hello”找到組件對(duì)象Hello的指針。
用戶一旦通過(guò)命名服務(wù)獲得某個(gè)組件服務(wù),其與組件服務(wù)交互的過(guò)程不再需要與命名服務(wù)相關(guān)聯(lián)。即步驟5完成以后,客戶端進(jìn)程得到了服務(wù)進(jìn)程中命名服務(wù)所對(duì)應(yīng)的組件指針包括本地組件指針或者遠(yuǎn)程組件指針,他們之間的通訊通過(guò)組件調(diào)用或者遠(yuǎn)程接口通訊方式進(jìn)行,而與命名服務(wù)組件無(wú)關(guān)。
上述步驟1至步驟5完成了用戶和內(nèi)核都可以創(chuàng)建一個(gè)命名服務(wù),其它用戶可以透明的獲得該用戶指針,而無(wú)需考慮其所在位置空間的不同。用戶一旦通過(guò)命名服務(wù)獲得某個(gè)組件服務(wù),其與組件服務(wù)交互的過(guò)程不再需要與命名服務(wù)相關(guān)聯(lián)。因?yàn)榻M件對(duì)象與命名服務(wù)對(duì)象相對(duì)獨(dú)立,命名服務(wù)只是將字符串和組件服務(wù)對(duì)象關(guān)聯(lián),因此相關(guān)組件服務(wù)動(dòng)態(tài)更新或者升級(jí),不影響其它通過(guò)命名服務(wù)獲取該命名服務(wù)的程序,其依然可以無(wú)需改動(dòng),無(wú)需重新編譯地正常工作。
在上述具體實(shí)施方式
,更好的實(shí)施是在上述步驟5之后,還包括如下的流程步驟6、客戶端進(jìn)程調(diào)用組件Hello的服務(wù)函數(shù);步驟7、客戶端進(jìn)程通過(guò)Event對(duì)象通知服務(wù)端進(jìn)程,釋放組件Hello的接口指針,client進(jìn)程退出;在步驟7之后,服務(wù)端進(jìn)程也可以進(jìn)行注銷步驟8、server進(jìn)程接到通知后注銷命名服務(wù);步驟9、server進(jìn)程釋放組件Hello的指針,并退出。
在步驟9之后,如果客戶利用所述字符串從內(nèi)核獲得所述組件接口指針,將無(wú)法獲得,并且返回錯(cuò)誤。
上敘事件的等待,以及進(jìn)程間事件的通知過(guò)程的實(shí)現(xiàn)是通過(guò)內(nèi)核對(duì)象event實(shí)現(xiàn)的,進(jìn)程間event指針的獲取亦是通過(guò)命名服務(wù)獲得的。
命名服務(wù)機(jī)制的實(shí)質(zhì)是將一個(gè)組件和指定的字符串綁定的過(guò)程,組件使用者可以遠(yuǎn)程通過(guò)字符串查詢?cè)摻M件,并獲得組件服務(wù)。命名服務(wù)本身即可以作為一個(gè)單獨(dú)的構(gòu)件存在,亦可以作為內(nèi)核功能的一部分。
遠(yuǎn)程CAR組件在創(chuàng)建的時(shí)候會(huì)向內(nèi)核注冊(cè)相關(guān)信息,并建立存根,稱為Stub,遠(yuǎn)程用戶獲得組件指針的時(shí)候在自己進(jìn)程空間建立代理,稱為proxy。
遠(yuǎn)程CAR組件在內(nèi)核注冊(cè)的信息代表了該組件對(duì)象的存在,我們通過(guò)一個(gè)內(nèi)核對(duì)象Object代表某個(gè)組件的注冊(cè)信息,通過(guò)此信息,可以找到相關(guān)建立代理所必須的信息,另一方面,也可通過(guò)這些信息找到該遠(yuǎn)程組件以及組件服務(wù)相關(guān)信息。
命名服務(wù)的實(shí)現(xiàn)主要是通過(guò)在內(nèi)核創(chuàng)建代表一個(gè)命名服務(wù)的對(duì)象NameHook,然后將該對(duì)象與該命名服務(wù)綁定的組件對(duì)象在內(nèi)核的注冊(cè)信息對(duì)象Object相綁定,NameHook,Object,Stub對(duì)象在系統(tǒng)里面存在一一對(duì)應(yīng)的關(guān)系,這樣通過(guò)字符串就可以找到相應(yīng)的NameHook,通過(guò)NameHook則可以發(fā)現(xiàn)相應(yīng)組件對(duì)象的Object,通過(guò)Object又可獲得足夠建立Proxy的信息。
而對(duì)于注冊(cè)一個(gè)命名服務(wù),則是通過(guò)API函數(shù)EzRegisterService完成的,該API函數(shù)將一個(gè)字符串與一個(gè)組件接口相綁定,實(shí)際上這里的組件接口也可能是一個(gè)遠(yuǎn)程組件接口代理,這樣就分成兩種情況做不同的處理1、接口是一個(gè)遠(yuǎn)程組件接口代理,則通過(guò)接口代理,找到相應(yīng)的Object,然后創(chuàng)建命名對(duì)象NameHook,將二者綁定。
即,步驟1中組件的指針為遠(yuǎn)程組件指針,是指組件的遠(yuǎn)程接口代理,該指針實(shí)際上是一個(gè)代理proxy對(duì)象指針,遠(yuǎn)程組件指針與內(nèi)核中一個(gè)存根stub對(duì)象以及注冊(cè)信息對(duì)象唯一對(duì)應(yīng);可以存在多個(gè)proxy對(duì)象和一個(gè)stub以及Object對(duì)象對(duì)應(yīng)的情況,步驟2獲得組件對(duì)象在內(nèi)核的注冊(cè)信息對(duì)象具體為根據(jù)遠(yuǎn)程組件指針與內(nèi)核中一個(gè)存根stub對(duì)象以及注冊(cè)信息對(duì)象唯一對(duì)應(yīng)得關(guān)系找到注冊(cè)信息對(duì)象。
其中,接口是一個(gè)遠(yuǎn)程組件接口代理,上述步驟1-5過(guò)程如圖2所示EzFindService API函數(shù)的實(shí)現(xiàn)流程,通過(guò)查詢字符串獲得命名對(duì)象NameHook,由命名對(duì)象NameHook的標(biāo)志字符串如“hello”找到注冊(cè)信息對(duì)象Object,找到注冊(cè)信息對(duì)象后,根據(jù)遠(yuǎn)程組件指針與存根stub對(duì)象以及內(nèi)核中一個(gè)注冊(cè)信息對(duì)象唯一對(duì)應(yīng)得關(guān)系找到組件對(duì)象。
2、接口是一個(gè)本地對(duì)象接口指針,則創(chuàng)建或者找到相應(yīng)的存根(stub),然后向內(nèi)核注冊(cè)相關(guān)信息,并生成Object對(duì)象,創(chuàng)建命名對(duì)象NameHook,將二者綁定。
即,步驟1中組件的指針為本地組件指針;步驟2獲得組件對(duì)象在內(nèi)核的注冊(cè)信息對(duì)象具體為服務(wù)端進(jìn)程通過(guò)本地組件指針,找到或者創(chuàng)建存根stub對(duì)象,生成和存根stub對(duì)象相關(guān)聯(lián)的注冊(cè)信息對(duì)象。
相對(duì)于命名服務(wù)對(duì)象所獲得的組件對(duì)象,命名服務(wù)對(duì)象亦是一個(gè)普通的組件使用者,提供命名服務(wù)的程序可以選擇在一個(gè)合適的時(shí)間點(diǎn)釋放該組件服務(wù)指針。所有適應(yīng)于CAR構(gòu)件生命周期管理的操作和語(yǔ)義亦適應(yīng)于命名服務(wù),命名服務(wù)也是一種組件服務(wù)。并且,命名服務(wù)的生命周期由命名服務(wù)創(chuàng)建者所控制,但使用命名服務(wù)的程序可以通過(guò)系統(tǒng)事件,或者進(jìn)程間通訊給服務(wù)創(chuàng)建者相關(guān)服務(wù)使用信息,命名服務(wù)創(chuàng)建者可以通過(guò)對(duì)服務(wù)使用情況的分析來(lái)選擇退出時(shí)機(jī),符合普通car組件的生存原則。
調(diào)用注銷服務(wù)函數(shù)(EzUnregisterService)注銷命名服務(wù),其實(shí)是取消NameHook對(duì)象與相應(yīng)Object對(duì)象的關(guān)聯(lián),以及銷毀NameHook的過(guò)程。在取消關(guān)聯(lián)的同時(shí),會(huì)釋放相關(guān)組件指針,并不再允許用戶通過(guò)命名服務(wù)獲得組件服務(wù)。
鑒于命名服務(wù)和關(guān)聯(lián)組件可能屬于不同用戶所構(gòu)建,則關(guān)聯(lián)組件有可能提早被其所屬進(jìn)程退出,或者發(fā)生異常,提前退出,內(nèi)核則會(huì)檢測(cè)到這種情況的發(fā)生,銷毀NameHook以及Object對(duì)象以防止該組件指針再被用戶利用。而以往獲得的組件指針將會(huì)全部失效,在調(diào)用過(guò)程中內(nèi)核會(huì)返回一個(gè)錯(cuò)誤值,以通知用戶。即,相關(guān)組件服務(wù)退出,命名服務(wù)不再有效,其它再試圖通過(guò)命名服務(wù)獲取相關(guān)組件服務(wù)的程序?qū)⒎祷劐e(cuò)誤。所有命名服務(wù)以及相關(guān)組件服務(wù)資源都已回收,上述步驟3將返回錯(cuò)誤。
因此,本發(fā)明命名服務(wù)機(jī)制具有以下特點(diǎn)1、用戶程序通過(guò)字符串獲取相關(guān)服務(wù),而服務(wù)則可由系統(tǒng),以及其它用戶程序提供,這樣將服務(wù)和服務(wù)使用者隔離的方式,減小了代碼的耦合性,極大的增強(qiáng)了代碼的可擴(kuò)展性,安全性,同時(shí)也最大的發(fā)揮了系統(tǒng)的功能。
2、從擴(kuò)展性來(lái)看,用戶可以通過(guò)在保持接口定義不變的情況下,修改服務(wù)程序代碼,升級(jí)服務(wù)程序;另一方面用戶亦可以通過(guò)提供新的接口,來(lái)擴(kuò)展新的功能,新的用戶可以利用新的接口,而舊的用戶則不會(huì)產(chǎn)生影響,其代碼可以不經(jīng)修改,不經(jīng)重新編譯,正常運(yùn)行。用戶通過(guò)CAR構(gòu)件方式實(shí)現(xiàn)的程序,都可以通過(guò)命名服務(wù)機(jī)制的方式,提供給其它遠(yuǎn)程用戶。
3、從安全性來(lái)看,用戶可以通過(guò)將一個(gè)信任度不高的服務(wù)啟動(dòng)在一個(gè)單獨(dú)的進(jìn)程中,并通過(guò)命名服務(wù)機(jī)制獲得,這樣就通過(guò)進(jìn)程地址空間機(jī)制,隔離了服務(wù)與用戶,同時(shí)服務(wù)之間的數(shù)據(jù)交換可以經(jīng)過(guò)系統(tǒng)的構(gòu)件平臺(tái)數(shù)據(jù)交互機(jī)制的檢測(cè)。
4、命名服務(wù)機(jī)制允許將系統(tǒng)提供的各種服務(wù)接口,比如進(jìn)程,線程,module,同步對(duì)象等與對(duì)應(yīng)的字符串綁定,其它進(jìn)程可以通過(guò)命名服務(wù)機(jī)制非常方便的獲得該進(jìn)程,從而能很方便的實(shí)現(xiàn)進(jìn)程間通訊,擴(kuò)展了系統(tǒng)的功能。
綜上所述,命名服務(wù)機(jī)制以簡(jiǎn)單的三個(gè)API函數(shù),提供對(duì)服務(wù)組件和字符串的綁定,到獲取,到注銷的整套機(jī)制,用非常簡(jiǎn)約而且容易理解的方式提供給用戶。
最后所應(yīng)說(shuō)明的是,以上實(shí)施例僅用以說(shuō)明本發(fā)明的技術(shù)方案而非限制,盡管參照較佳實(shí)施例對(duì)本發(fā)明進(jìn)行了詳細(xì)說(shuō)明,本領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解,可以對(duì)本發(fā)明的技術(shù)方案進(jìn)行修改或者等同替換,而不脫離本發(fā)明技術(shù)方案的精神和范圍,其均應(yīng)涵蓋在本發(fā)明的權(quán)利要求范圍當(dāng)中。
權(quán)利要求
1.一種命名服務(wù)機(jī)制,其特征在于包括以下步驟步驟1、服務(wù)端進(jìn)程獲得一個(gè)組件對(duì)象的指針;步驟2、服務(wù)端進(jìn)程將獲得的組件對(duì)象的指針與一個(gè)字符串綁定,并注冊(cè)到內(nèi)核,獲得組件對(duì)象在內(nèi)核的注冊(cè)信息對(duì)象,內(nèi)核創(chuàng)建一個(gè)代表命名服務(wù)的命名服務(wù)對(duì)象,并將命名服務(wù)對(duì)象以所述字符串為標(biāo)志與注冊(cè)信息對(duì)象綁定;步驟3、客戶端進(jìn)程利用所述字符串查詢獲得所述命名服務(wù)對(duì)象;步驟4、客戶端進(jìn)程找到綁定的所述字符串對(duì)應(yīng)的注冊(cè)信息對(duì)象;步驟5、客戶端進(jìn)程通過(guò)所述注冊(cè)信息對(duì)象和字符串找到組件對(duì)象的指針。
2.根據(jù)權(quán)利要求1所述的命名服務(wù)機(jī)制,其特征在于所述步驟5之后還具有以下步驟步驟6、客戶端進(jìn)程利用所獲得的組件對(duì)象的接口指針調(diào)用組件方法;步驟7、客戶端進(jìn)程釋放所述組件對(duì)象接口指針,通知服務(wù)端進(jìn)程。
3.根據(jù)權(quán)利要求2所述的命名服務(wù)機(jī)制,其特征在于所述步驟7之后還具有以下步驟步驟8、服務(wù)端進(jìn)程注銷所述命名服務(wù)對(duì)象;步驟9、服務(wù)端進(jìn)程釋放所述組件對(duì)象的接口指針。
4.根據(jù)權(quán)利要求3所述的命名服務(wù)機(jī)制,其特征在于所述步驟9之后,如果客戶利用所述字符串從內(nèi)核獲得所述組件接口指針,將無(wú)法獲得,并且返回錯(cuò)誤。
5.根據(jù)權(quán)利要求4所述的命名服務(wù)機(jī)制,其特征在于所述步驟1中組件對(duì)象的指針為本地組件指針;所述步驟2獲得組件對(duì)象在內(nèi)核的注冊(cè)信息對(duì)象具體為服務(wù)端進(jìn)程通過(guò)本地組件指針,找到或者創(chuàng)建存根對(duì)象,生成和所述存根對(duì)象相關(guān)聯(lián)的注冊(cè)信息對(duì)象。
6.根據(jù)權(quán)利要求4所述的命名服務(wù)機(jī)制,其特征在于所述步驟1中組件對(duì)象的指針為遠(yuǎn)程組件指針,所述遠(yuǎn)程組件指針與存根對(duì)象以及內(nèi)核中一個(gè)注冊(cè)信息對(duì)象唯一對(duì)應(yīng);所述步驟2獲得組件對(duì)象在內(nèi)核的注冊(cè)信息對(duì)象具體為根據(jù)所述遠(yuǎn)程組件指針與其唯一對(duì)應(yīng)的關(guān)系找到注冊(cè)信息對(duì)象。
全文摘要
本發(fā)明涉及一種命名服務(wù)機(jī)制,包括以下步驟步驟1服務(wù)端進(jìn)程獲得一個(gè)組件對(duì)象指針;步驟2服務(wù)端進(jìn)程將獲得的組件對(duì)象指針與一個(gè)字符串綁定,并注冊(cè)到內(nèi)核,獲得組件對(duì)象在內(nèi)核的注冊(cè)信息對(duì)象,內(nèi)核創(chuàng)建一個(gè)代表命名服務(wù)的命名服務(wù)對(duì)象,并將命名服務(wù)對(duì)象以所述字符串為標(biāo)志與注冊(cè)信息對(duì)象綁定;步驟3客戶端進(jìn)程利用所述字符串查詢獲得所述命名服務(wù)對(duì)象;步驟4客戶端進(jìn)程找到綁定的所述字符串對(duì)應(yīng)的注冊(cè)信息對(duì)象;步驟5客戶端進(jìn)程通過(guò)所述注冊(cè)信息對(duì)象和字符串找到組件對(duì)象的指針。因此本發(fā)明可以支持遠(yuǎn)程接口代理,實(shí)現(xiàn)字符串與對(duì)象的綁定,且允許將任意接口代理與字符串綁定。
文檔編號(hào)G06F9/44GK1971508SQ20061011898
公開(kāi)日2007年5月30日 申請(qǐng)日期2006年12月1日 優(yōu)先權(quán)日2006年12月1日
發(fā)明者蘇翼鵬, 劉亞?wèn)|, 梁宇洲, 陳榕, 王晨輝 申請(qǐng)人:上??铺┦兰o(jì)科技有限公司