- 1、本文档共56页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第7章客户程序C映射
第7章 客户程序的C++映射;客户程序的C++映射;;_ptr引用的语义;;_ptr引用的语义;ORB的初始化;初始引用;对象伪接口;;对象伪接口;_var引用;;参数传递规则;;生成的_out类型
out参数往往采用正式的参数类型typename_out。如long类型的out参数,正式类型为CORBA::Long_out。这是因为对于定长度类型和变长度类型的out参数,所使用的内存管理规则不一样。
对于定长度类型,生成的_out类型只是引用的类型定义。例如,Long_out在CORBA名字空间中定义如下:
typedef Long Long_out
对于变长度类型,生成的_out类型是一个类。如String_out在名字空间中定义为一个类:
class String_out{};
原因在于内存管理规则。变长度类型由被调用的函数进行内存分配,并且为变长度类型生成的_out类可以确保内存被正确释放。;参数传递规则;复杂的定长度类型的参数传递
复杂的基本和简单类型的传递相似。只是由于效率方面的原因,in参数通过指向const类型的引用方式来传递。Const Fls ,inout—Fls,out—Fls_out
包含定长度元素的数组的参数传递
因为C++不允许通过数值方式来传递数组,因此存根中使用了数组的指针。
typedef double Darr[3];
typedef Double Darr_slice;
virtual Darr_slice* darr_op{
const Darr darr_in, Darr_slice * darr_inout, Darr_out darr_out)=0;
Darr_slice *表示指向元素类型的指针。;参数传递规则;变长度参数的内存管理;变长度参数的内存管理;当客户程序调用name方法时,它将调用代理对象的一个成员函数。事件的顺序如下:
(1) 代理的name成员函数创建一个包含操作名称、对象密钥和操作的in和inout参数(这里没有)的请求。
(2)代理成员函数把请求写到服务器程序的连接中,并立即调用连接中阻塞读取的操作(在此是recv_len)。运行时的客户端程序将阻塞,直到收到服务器程序的应答为止。;(3) 此时,请求将通过网络传输给服务器程序。服务器程序将阻塞在get_request操作中,等待客户端连接收到请求。
(4) 客户程序得到外来请求后将继续执行get_request,通过它来获取操作名与对象密钥。
(5) 运行时的服务器程序调用一个普通的invoke函数,其中的一个参数是操作名。Invoke通过操作名来标识正确的应用程序成员函数,以调用应用程序代码。
;变长度参数的内存管理;变长度参数的内存管理;;变长度参数的内存管理;变长度参数的内存管理;变长度参数的内存管理;远程调用和配置在一起调用的透明性是变长度参数内存管理规则的核心。变长度参数的传递要遵循此规则,用于返回值的规则同样也适用于inout参数和out参数。
注意:在发送端分配一个变长度值,而在接收端将它释放掉。;字符串和宽位字符串的参数传递;Out参数作为CORBA::string_out类来传递,它是一个类,它的构造函数中有一个参数的类型是char* ,它被设置为代理分配的字符串的地址,这也就是为什么要传递一个指向指针的引用(代理必须设置指针的值,而不仅仅是指针指向的字节)。调用程序只对最终由string_free释放的字符串负责。
返回值与out参数相似。代理对字符串内存分配和初始化,调用程序最终释放。
宽位字符串一样,只是用wstring而已。;参数传递规则的小结;使用_var类型来传递参数;参数传递的陷阱;传递未初始化的in或inout参数
在传递未初始化的字符串和结构时,因为字符串被映射为char *类型,传递一个未初始化的字符串易破坏程序;编组代码或者会间接引用一个空指针,或者会间接引用一个无用指针。如果传递一个缺省的构造的String_var,那么就会传递一个空指针。然而,传递一个篏套的未初始化的字符串是安全的,因为篏套的字符串可以初始化为一个空字符串。
联合也一样,在C++映射中,在IDL接口之间传递一个未初始化的联合是非法的。;参数传递的陷阱;服务器端C++映射;客户发送请求,服务器程序的ORB接收请求,再发送给POA,并在POA中创建目标对象。然后,POA再次调度请求给实现目标对象的伺服程序。伺服程序则执行请求,并返回out和返回值。;服务器端C++映射;服务器端C++映射;接口的映射;注意:
(1) 只有最外层的作用域名称才使用POA_前缀。
(2) 框架类由PortableServer::ServantBase继承得到,
文档评论(0)