版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第7章 客戶程序的C+映射,接口映射 在客戶端生成一個(gè)代理,代理類向客戶程序提供一個(gè)定位透明的接口,由IDL定義所生成,每一個(gè)IDL接口都會(huì)生成一個(gè)單獨(dú)的C+代理類。 (1) 生成的代理類與IDL中定義的接口名相同 (2) 代理類由CORBA:Object繼承得到 (3) 代理類提供了一個(gè)與IDL中定義的操作相對(duì)應(yīng)的一個(gè)同名方法。 (4) 此方法被說明為純虛擬函數(shù),此代理類是不能被實(shí)例化的抽象基類。,客戶程序的C+映射,對(duì)象引用類型 (1) MyObject-這是一個(gè)代理基類 (2) MyObject_ptr-這是一個(gè)原始的對(duì)象引用類型,類似于C+類的實(shí)例指針 (3) MyObject_var
2、可以被作為代理的句柄,它與MyObject_ptr非常相似,只是增加了內(nèi)存管理。 對(duì)象引用的生命周期 (1) 當(dāng)對(duì)象引用進(jìn)入客戶程序的地址空間時(shí),有客戶端的ORB代表客戶程序創(chuàng)建代理。ORB向客戶程序返回一個(gè)指向新代理的_ptr引用。 (2) 客戶程序可以撤消引用 (3) 客戶程序可以創(chuàng)建引用所保存的拷貝。 (4) 客戶程序可以創(chuàng)建一個(gè)空引用。,刪除引用 MyObject_ptr mop=; CORBA:release(mop) 引用拷貝 MyObject_ptr mop1=MYObject:_duplicate(mop);,_ptr引用的語(yǔ)義,代理與_ptr引用的映射 在生成代理類的同時(shí)就會(huì)
3、生成_ptr引用。_ptr引用必須被當(dāng)作C+指針來使用。 繼承與擴(kuò)展 _ptr引用是指向相應(yīng)代理類的C+指針,_ptr支持隱式擴(kuò)展,即指向派生類的指針可以賦給指向基類的指針。 _ptr引用之間的普通賦值是淺賦值。對(duì)引用計(jì)數(shù)不會(huì)產(chǎn)生影響。,緊縮轉(zhuǎn)換 在C+中,拒絕把指向基類的指針賦值給指向派生類的指針。強(qiáng)制轉(zhuǎn)換是錯(cuò)誤的。 類型安全的緊縮 可以用_narrow來進(jìn)行安全的強(qiáng)制類型向下轉(zhuǎn)換,與需要的類型相匹配時(shí),返回非空引用,不匹配則返回空引用。_narrow與C+中的dynamic_cast非常相似,作用相同。,_ptr引用的語(yǔ)義,非法使用_ptr引用 (1) 進(jìn)行相等或不等的比較 (2) 對(duì)引用
4、使用關(guān)系運(yùn)算符: (3) 對(duì)引用使用算術(shù)運(yùn)算符 (4) 將_ptr引用轉(zhuǎn)換為void *,或?qū)oid *轉(zhuǎn)換為_ptr (5) 不采用_narrow進(jìn)行向下強(qiáng)制類型轉(zhuǎn)換,,ORB的初始化,1. 用ORB_init來對(duì)ORB進(jìn)行初始化 ORB_ptr ORB_init( int argc是argv中的輸入項(xiàng)個(gè)數(shù) argv是傳遞給main的命令行參數(shù)向量 orb_identifier是由供應(yīng)商指定的字符串(缺省情況下為空字符串)。,初始引用,ORB接口包含了兩個(gè)可以用來創(chuàng)建和獲取初始引用的操作 object_to_string 將引用轉(zhuǎn)換為一個(gè)可以打印的字符串 string_to_object
5、將字符串轉(zhuǎn)換為對(duì)象引用,可以返回任意類型的引用,此操作創(chuàng)建一個(gè)新的代理,因此在最后要調(diào)用release再次將引用釋放。,對(duì)象偽接口,偽接口:用PIDL調(diào)用的接口,不一定由Object隱式繼承,不能作為參數(shù)傳遞給普通接口,不能被動(dòng)態(tài)調(diào)用,在接口庫(kù)中沒有定義,有一種不同于普通規(guī)則的用于特殊目的的語(yǔ)言映射。 _is_a操作 用來測(cè)試對(duì)象引用是否支持由倉(cāng)庫(kù)id參數(shù)所支持的接口。 obj-_is_a(“IDL: 同_narrow相似,都用來測(cè)試引用是否支持某個(gè)接口。而_is_a不需要在編譯時(shí)知道接口信息,_narrow需要;_is_a用于DII。,_non_existent 用來測(cè)試引用是否標(biāo)識(shí)一個(gè)已有
6、的對(duì)象。與Ping操作相類似。 Ping操作用來測(cè)試與實(shí)現(xiàn)的一個(gè)對(duì)象的服務(wù)器程序是否可以聯(lián)系上。 _non_existent為了作出判斷,可能會(huì)與實(shí)現(xiàn)對(duì)象的服務(wù)器程序進(jìn)行聯(lián)系,并且可能會(huì)激活該服務(wù)器程序,可以用Ping來進(jìn)行聯(lián)系和激活。,對(duì)象偽接口,_is_equivalent 用來測(cè)試一個(gè)引用與另一個(gè)引用是否完全一樣。如果返回true,則表明兩個(gè)引用完全相同,返回false,則表示可能相同,也可能不同。此操作必須是高效的,因此只能在本地實(shí)現(xiàn) _hash 用來測(cè)試引用集合。如果兩個(gè)引用返回不同的散列值,則表示引用肯定時(shí)不同的 _is_nil 用來測(cè)試一個(gè)引用是否為空,_var引用,_var引用
7、的映射 _var引用的映射與String_var的映射非常相似。對(duì)于每個(gè)IDL接口,編譯器不僅生成接口類和_ptr類型,而且添加了一個(gè)_var類。其中的操作與String_var類似。 用_ptr給_var進(jìn)行初始化或賦值,是一個(gè)淺賦值。 用一個(gè)_var對(duì)另一個(gè)_var進(jìn)行初始化或賦值,是一個(gè)深賦值。 _var引用與擴(kuò)展 不允許通過其它的_var類型對(duì)它們進(jìn)行隱式的初始化或擴(kuò)展賦值。必須顯式的調(diào)用_duplicate。,同時(shí)使用_var和_ptr引用 _var引用可以轉(zhuǎn)變?yōu)橹羔樢?,因此可以進(jìn)行從派生_var類到基_ptr類的擴(kuò)展賦值。此賦值是淺賦值。 篏套在用戶定義類型中的引用 引用篏套在用
8、戶定義類型內(nèi),就需要使用_mgr引用。,參數(shù)傳遞規(guī)則,參數(shù)傳遞規(guī)則主要是為了考慮位置透明性和高效性來制定的。 位置透明性:相同還是不同地址空間,參數(shù)的內(nèi)存管理規(guī)則必須統(tǒng)一。這一條件允許相同的源代碼用于被配置在一起的對(duì)象和遠(yuǎn)程對(duì)象。在此需要用到某些內(nèi)存管理規(guī)則,如變長(zhǎng)度的out參數(shù)必須由被調(diào)用的函數(shù)來分配,并且由調(diào)用程序來釋放。 高效性:要盡可能避免參數(shù)值的拷貝。通過對(duì)象引用來調(diào)用被配置在同一地址空間的CORBA對(duì)象幾乎與通過虛擬函數(shù)來調(diào)用C+對(duì)象一樣快。在此要求大的數(shù)值應(yīng)該由引用來傳遞,而不是數(shù)值。,定長(zhǎng)度類型和變長(zhǎng)度類型 定長(zhǎng)度類型: 整數(shù)類型;浮點(diǎn)數(shù)類型;定點(diǎn)數(shù)類型;字符類型;boolea
9、n;octet;枚舉類型。 變長(zhǎng)度類型: string和wstring;對(duì)象引用;any類型;序列類型 結(jié)構(gòu)、聯(lián)合和數(shù)組是變長(zhǎng)還是定長(zhǎng)主要是看他們包含的元素類型。,生成的_out類型 out參數(shù)往往采用正式的參數(shù)類型typename_out。如long類型的out參數(shù),正式類型為CORBA:Long_out。這是因?yàn)閷?duì)于定長(zhǎng)度類型和變長(zhǎng)度類型的out參數(shù),所使用的內(nèi)存管理規(guī)則不一樣。 對(duì)于定長(zhǎng)度類型,生成的_out類型只是引用的類型定義。例如,Long_out在CORBA名字空間中定義如下: typedef Long 原因在于內(nèi)存管理規(guī)則。變長(zhǎng)度類型由被調(diào)用的函數(shù)進(jìn)行內(nèi)存分配,并且為變長(zhǎng)度類型
10、生成的_out類可以確保內(nèi)存被正確釋放。,參數(shù)傳遞規(guī)則,簡(jiǎn)單類型的參數(shù)傳遞 簡(jiǎn)單類型由數(shù)值方式還是引用方式來傳遞取決于被調(diào)用函數(shù)是否可以修改參數(shù)。 in參數(shù)采用值傳遞的方式,它的值不會(huì)改變。 inout和out參數(shù)采用引用方式傳遞,因?yàn)樵谡{(diào)用過程中可能會(huì)修改它的值。Long_out是Long char * s; s=p-name(); string_free(s);,while (!done) op=get_request(); char * s; s=invoke(op); send(s) CORBA:string_free(s); ,char * name() p-invoke(“name
11、”); unsigned len; len=recv_len(); s=string_alloc(len); recv(s); return s; ,char * name() char * s; s=string_dup(); return s; ,Request,Reply,返回一個(gè)變長(zhǎng)度值遠(yuǎn)程情況下,Client,Server,變長(zhǎng)度參數(shù)的內(nèi)存管理,在變長(zhǎng)度類型時(shí),在服務(wù)器和客戶程序之間關(guān)系如下: 接口如下定義: interface Person string name(); 客戶程序如下: Person_var p=; char s*; s=p-name(); / CORBA:stri
12、ng_free(s);,當(dāng)客戶程序調(diào)用name方法時(shí),它將調(diào)用代理對(duì)象的一個(gè)成員函數(shù)。事件的順序如下: (1) 代理的name成員函數(shù)創(chuàng)建一個(gè)包含操作名稱、對(duì)象密鑰和操作的in和inout參數(shù)(這里沒有)的請(qǐng)求。 (2)代理成員函數(shù)把請(qǐng)求寫到服務(wù)器程序的連接中,并立即調(diào)用連接中阻塞讀取的操作(在此是recv_len)。運(yùn)行時(shí)的客戶端程序?qū)⒆枞钡绞盏椒?wù)器程序的應(yīng)答為止。,(3) 此時(shí),請(qǐng)求將通過網(wǎng)絡(luò)傳輸給服務(wù)器程序。服務(wù)器程序?qū)⒆枞趃et_request操作中,等待客戶端連接收到請(qǐng)求。 (4) 客戶程序得到外來請(qǐng)求后將繼續(xù)執(zhí)行g(shù)et_request,通過它來獲取操作名與對(duì)象密鑰。 (5)
13、 運(yùn)行時(shí)的服務(wù)器程序調(diào)用一個(gè)普通的invoke函數(shù),其中的一個(gè)參數(shù)是操作名。Invoke通過操作名來標(biāo)識(shí)正確的應(yīng)用程序成員函數(shù),以調(diào)用應(yīng)用程序代碼。,變長(zhǎng)度參數(shù)的內(nèi)存管理,(6) 現(xiàn)在,控制權(quán)移交給服務(wù)器端的由應(yīng)用程序提供的name函數(shù)。Name函數(shù)通過string_dup來分配和初始化字符串的內(nèi)存,并且返回指向這個(gè)內(nèi)存緩沖區(qū)的指針。 (7) 控制權(quán)又移交給服務(wù)器端的運(yùn)行時(shí)ORB,并且需要運(yùn)行時(shí)ORB傳遞一個(gè)指向已分配過的字符串的指針?,F(xiàn)在,運(yùn)行時(shí)ORB構(gòu)造一個(gè)包含字符串拷貝的應(yīng)答,并且將這個(gè)應(yīng)答發(fā)給客戶程序。,變長(zhǎng)度參數(shù)的內(nèi)存管理,(8) 服務(wù)器端的運(yùn)行時(shí)ORB調(diào)用string_free來釋
14、放這個(gè)字符串。(因?yàn)樽址膬?nèi)容已經(jīng)發(fā)送給了客戶程序) (9) 現(xiàn)在,服務(wù)器端的運(yùn)行時(shí)ORB已經(jīng)完成了調(diào)度循環(huán)中的一次循環(huán),它將再次調(diào)用get_request,直到下一個(gè)客戶請(qǐng)求到來后,才能繼續(xù)下面的操作。 (10) 同時(shí),應(yīng)答通過網(wǎng)絡(luò)傳遞給客戶程序,客戶程序?qū)?zhí)行recv_len下面的操作。返回值是一個(gè)字節(jié)計(jì)數(shù)器,用來表示字符串的長(zhǎng)度。,(11) 客戶端的運(yùn)行時(shí)ORB調(diào)用string_alloc來創(chuàng)建一個(gè)包含len字節(jié)的緩沖區(qū),并且調(diào)用recv,以便將字符串內(nèi)容讀到緩沖區(qū)中。 (12) 返回一個(gè)指向包含字符串的緩沖區(qū)的指針后,客戶端的存根將結(jié)束。 (13) 現(xiàn)在,控制權(quán)移交給使用字符串的應(yīng)用
15、程序代碼,應(yīng)用程序在最后將通過調(diào)用string_free擦字符串釋放掉。,變長(zhǎng)度參數(shù)的內(nèi)存管理,這里應(yīng)該注意,客戶程序或服務(wù)器程序中都沒有內(nèi)存泄漏現(xiàn)象: (1) 在服務(wù)器端,應(yīng)用程序調(diào)用string_alloc,框架中生成的代碼將在把字符串發(fā)送給客戶程序后,調(diào)用string_free。 (2) 在客戶端,生成的存根代碼將調(diào)用string_alloc,并且向應(yīng)用程序代碼返回一個(gè)指向字符串的指針,string_free在應(yīng)用程序中被調(diào)用。,變長(zhǎng)度參數(shù)的內(nèi)存管理,Person_var p=; char * s; s=p-name(); string_free(s);,char * name() ch
16、ar * s; s=string_dup(); /Fill string return s; ,返回一個(gè)變長(zhǎng)度值配置在一起的情況,變長(zhǎng)度參數(shù)的內(nèi)存管理,配置在一起的情況下,和前面一樣,客戶程序調(diào)用它的代理的name成員函數(shù)。然而,現(xiàn)在對(duì)于客戶程序的地址空間而言,這個(gè)成員函數(shù)是本地的,因此沒有必要檢查所有與網(wǎng)絡(luò)有關(guān)的代碼。 注意:配置客戶程序與服務(wù)器程序時(shí),不需要改變應(yīng)用程序源代碼。最重要的時(shí)內(nèi)存規(guī)則沒有改變。服務(wù)器程序調(diào)用string_alloc,客戶程序調(diào)用string_free,因此這里不會(huì)出現(xiàn)內(nèi)存的泄漏。,遠(yuǎn)程調(diào)用和配置在一起調(diào)用的透明性是變長(zhǎng)度參數(shù)內(nèi)存管理規(guī)則的核心。變長(zhǎng)度參數(shù)的傳遞要
17、遵循此規(guī)則,用于返回值的規(guī)則同樣也適用于inout參數(shù)和out參數(shù)。 注意:在發(fā)送端分配一個(gè)變長(zhǎng)度值,而在接收端將它釋放掉。,字符串和寬位字符串的參數(shù)傳遞,in參數(shù)作為const char *類型來傳遞。字符串調(diào)用程序進(jìn)行內(nèi)存的分配、初始化和釋放。 inout參數(shù)作為char * 生成的頭文件中包含下面的框架類定義: class POA_MyObject;,注意: (1) 只有最外層的作用域名稱才使用POA_前綴。 (2) 框架類由PortableServer:ServantBase繼承得到, PortableServer:ServantBase是所有框架類共同的基類。 (3) 框架類提供一個(gè)
18、與IDL的操作相對(duì)應(yīng)的方法 (4) 此方法被說明為純虛函數(shù),因此不能實(shí)例化抽象基類。 (5) 方法中包含了一個(gè)異常說明,這個(gè)異常說明用來限制此方法能發(fā)送C+異常的類型。CORBA:SystemException基類包含所有框架類的異常說明。,伺服類,為了創(chuàng)建MyObject類型的一個(gè)CORBA對(duì)象,必須從POA_MyObject類中派生一個(gè)伺服類,并且實(shí)現(xiàn)所有的純虛擬方法。 假設(shè)編寫一個(gè)IDL為my_object.idl文件,對(duì)此編譯。 (1) 建立伺服類時(shí)要包含生成的服務(wù)器端頭文件my_objectS.hh,在my_object.idl文件中包含了接口的定義,包含這個(gè)頭文件是為了獲取POA_
19、MyObject基類的說明。 (2) 伺服類的名稱MyObject_impl的選擇完全由程序決定,符合習(xí)慣,使用_impl后綴。,(3) MyObject_impl類由POA_MyObject框架類繼承得到,并且重載了純虛函數(shù)get_value。這就使得MyObject_impl成為一個(gè)可以實(shí)例化的具體類。 (4) 必須在自己的伺服類中實(shí)現(xiàn)所有繼承得到的純虛函數(shù),否則,不允許創(chuàng)建伺服類實(shí)例。也可以假如任何對(duì)支持伺服類的實(shí)現(xiàn)有用的東西。例如:構(gòu)造函數(shù)、析構(gòu)函數(shù)、附加的成員函數(shù),或數(shù)據(jù)成員等。在實(shí)際應(yīng)用中,很少需要對(duì)伺服程序進(jìn)行復(fù)制或賦值,因此建立隱藏伺服程序的拷貝構(gòu)造函數(shù)和缺省的賦值運(yùn)算符。可以
20、把其放在private:中來實(shí)現(xiàn)隱藏。,對(duì)象的實(shí)體,為了通過MyObject_impl伺服類的一個(gè)實(shí)例來使CORBA對(duì)象具體化,必須創(chuàng)建一個(gè)MyObject_impl伺服程序和一個(gè)CORBA對(duì)象,并把伺服程序注冊(cè)為CORBA對(duì)象的實(shí)體。 MyObject_impl servant(42);/創(chuàng)建一個(gè)伺服程序?qū)嵗?,在此只是一個(gè)C+對(duì)象,并沒有建立伺服程序和CORBA對(duì)象之間的連接。 MyObject_var object=servant._this();/創(chuàng)建一個(gè)CORBA對(duì)象,用創(chuàng)建的伺服程序來具體化這個(gè)對(duì)象。,在此調(diào)用伺服程序的_this函數(shù)過程隱式執(zhí)行了: (1) 在Root POA下創(chuàng)建
21、一個(gè)CORBA對(duì)象。 (2) 用Root POA把伺服程序注冊(cè)為新對(duì)象的實(shí)現(xiàn)。 (3) 為新對(duì)象創(chuàng)建一個(gè)對(duì)象引用。 (4) 返回新的對(duì)象引用。,對(duì)象的實(shí)體,_this函數(shù)由框架類提供。POA_MyObject類中包含了由IDL編譯器生成的_this成員函數(shù)。 對(duì)于任何表示IDL接口A的框架類POA_A,POA_A:_this函數(shù)的返回值都是A_ptr,即接口A的C+對(duì)象引用類型,因?yàn)檎{(diào)用_this的程序負(fù)責(zé)確保最終會(huì)對(duì)返回的對(duì)象引用調(diào)用CORBA:release,在此可以把這個(gè)返回值返回給A_var,它將負(fù)責(zé)釋放。,由_this創(chuàng)建的CORBA對(duì)象是一個(gè)暫態(tài)對(duì)象。暫態(tài)CORBA對(duì)象在POA中創(chuàng)
22、建,并且受該P(yáng)OA生命周期的限制。可以用合適的策略來創(chuàng)建伺服程序的POA,_this就能提供這種形式的創(chuàng)建和注冊(cè)服務(wù)。Root POA支持的策略的標(biāo)準(zhǔn)設(shè)置已經(jīng)被顯式設(shè)計(jì)為允許提供這種方式來使用_this。,服務(wù)器程序的main函數(shù),在完成服務(wù)器應(yīng)用程序時(shí),必須完成下面這些步驟。 (1) 提供標(biāo)準(zhǔn)的CORBA:ORB_init調(diào)用初始化ORB (2) 通過由ORB_init返回的ORB引用調(diào)用resolve_initial_references(“RootPOA”),通過resolve_initial_references可以獲取幾個(gè)主要接口的對(duì)象引用。這里用它來獲取一個(gè)指向ORB的Root POA的引用,由此又可以獲得Root POA的POAManager引用。激活POAManager可以用來使Root POA在ORB開始監(jiān)聽請(qǐng)求時(shí),馬上就開始處理請(qǐng)求。,(3) 創(chuàng)建一個(gè)MyObject_impl類型的伺服程序。 (4) 調(diào)用伺服程序的this函數(shù)來創(chuàng)建一個(gè)新的暫態(tài)的CORBA對(duì)象,并且用該伺服程序把它具體化。然后,把返回的對(duì)象引用存儲(chǔ)到MyObject_var中,以便當(dāng)MyObject_var離開作用域,返回的對(duì)象引用會(huì)自動(dòng)釋放。,(5) 為了使?jié)撛诘目蛻舫绦蚩梢允褂眯碌腃ORBA對(duì)象的對(duì)象引用,把對(duì)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 鑄造砂生產(chǎn)工藝制度規(guī)范
- 鋰化工設(shè)備管理制度規(guī)范
- 廠區(qū)地面清潔制度規(guī)范
- 大型劇場(chǎng)保潔規(guī)范制度
- 企業(yè)收款制度管理規(guī)范
- 進(jìn)一步規(guī)范罪犯收押制度
- 制度上墻固定規(guī)范要求
- 班主任工作制度制度規(guī)范
- 夫妻家庭制度管理規(guī)范
- 以制度規(guī)范為基本要求
- T-CDLDSA 09-2025 健身龍舞彩帶龍 龍舞華夏推廣套路技術(shù)規(guī)范
- 部編版初三化學(xué)上冊(cè)期末真題試題含解析及答案
- GB/T 19566-2025旱地糖料甘蔗高產(chǎn)栽培技術(shù)規(guī)程
- 去極端化條例解讀課件
- 光纖收發(fā)器培訓(xùn)
- 汽車減震器課件
- 水上拋石應(yīng)急預(yù)案
- 蘇州大學(xué)介紹
- 招標(biāo)公司勞動(dòng)合同范本
- 酒店消防安全應(yīng)急預(yù)案范本
- 輻射與安全培訓(xùn)北京課件
評(píng)論
0/150
提交評(píng)論