`
qiezi
  • 浏览: 491410 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

为C++实现一个IDL (五)

    博客分类:
  • c++
阅读更多
本篇没什么清晰的目的,只是解释一下前面的几个问题,并提出一些新的目标。

在“asgard项目遗留问题”中,我简单提到了几个问题,并且想了一些解决方案。

其中,最首要解决的是第2条“服务对象的大小”和第5条“全局元信息”,这2条将影响到调用机制、call对象的生成。一个调用将生成一个call对象,由线程池来处理,同步调用将由异步调用来模拟。

在call对象中,保存了所有in/out参数的包装对象。当处理同步调用时,由于out参数可能是一个栈上对象(或简单类型,这里统称对象),所以需要另一个包装类——outret模板类,它保存out参数的引用。

当同步调用发生时,生成一个call对象(当然out参数的引用已经包含在里面),把这个call对象交给线程池处理,调用的线程阻塞等待调用结束后被唤醒,这就是所谓的异步调用模拟同步调用。由于异步调用被包装起来了,所以在调用者看来跟同步调用没什么区别。当然这个动作并非必要,完全可以不使用模拟,而采用真正的同步调用,只是看到ICE是这么实现的,心痒痒而已。


asgard的目标是把现有的系统功能包装成为服务,所以在通用方面我考虑得比较多。

比如服务端要开放下面这样一个服务:

service StringService
{
    Method 
<string(inout<string>in<string>)> strcat;
    Method 
<string(inout<string>in<string>in<uint>)> strncat;
};

并且把C标准库中的strcat和strncat作为这2个方法的实现。

看一下存在哪些问题?

1、函数第1个参数如果直接映射为string,在服务端将出现缓冲区溢出。

2、C标准库中的strcat返回值是一个指针,它指向strcat的第一个参数(搞这个标准库的人是不是没想过这个返回值多么没用啊??直接返回一个操作的长度不是更好?),在服务端发回客户端时,这个并不需要被发回来,因为strcat的第1个参数已经能带回操作后的内容了。

3、strncat的第3个参数表示第1个缓冲区参数的长度,如果能把它和第1个参数合起来用一个buffer对象表示,就能省事了。

理想情况下,我们的服务对象这样来写:

service StringService
{
    Method 
<void(inout< buffer<char> >in<string>)> strcat;
    Method 
<void(inout< buffer<char> >in<string>)> strncat;
};

我们的目的是把老的代码包装成新鲜时髦的服务,当然不用保留老式代码中的指针,以及使用指针和长度2个值来表示一个缓冲区的做法。buffer类在构造时要接受一个size_t参数,指定缓冲区的大小。

这在服务端将产生映射问题,由于这个Method定义的形式和C标准库中的函数形式不一致。

我想应该去实现一个适配器模板类,比如:

this->strcat.setFunction (adapter<char*(char*const char*), convert<void0>(inout< buffer<char> >in<string>)> (::strcat));

this->strncat.setFunction (adapter<char*(char*const char*, size_t), convert<void0>(inout< buffer<char> >in<string>, length<in<uint>1>)> (::strncat));

convert<void, 0>表示把第0个参数(这里指返回值)转成void类型,length<in<uint>, 1>表示这个参数类型是int<uint>,它是从第1个参数中提取的长度,大致就是使用这种规则,语法可能以后会有变动。

这点内容是我几个月前就在考虑的,也是我想做这个项目的动机,不过直到最近一段时间才从可行性方面仔细考虑。

通过前面几个模板的练习,现在已经大致知道哪些东西是可以用模板做出来,哪些不能使用模板,这应该是最大的收获了。很多东西单靠模板或是虚函数都不好完成,但结合起来就能产生意想不到的效果。



又仔细想了一下,上面的代码应该还可以修改简化:

this->strcat.setFunction (adapter<convert<void0>(inout< buffer<char> >in<string>)> ( ) (::strcat));

this->strncat.setFunction (adapter<convert<void0>(inout< buffer<char> >in<string>, length<in<uint>1>)> ( ) (::strncat));

使用一个仿函数来做,函数指针的类型可以从operator ()的参数(模板参数)中推导出来。
分享到:
评论

相关推荐

    IDL接口定义语言的C++11语言映射规范(v1.0)

    C++ 11映射试图避免限制ORB开发人员的实现自由。对于每个OMG IDL构造,C++ 11映射解释使用C++ 11的构造的语法和语义。如果客户机或服务器程序使用C++ 11映射子句中所描述的结构,则符合此映射(是C++ 11)。

    servant C++语言框架rpc的源码实现 tools C++语言框架IDL工具的源码实现 util C++语言.7z

    tools C++语言框架IDL工具的源码实现 util C++语言框架基础工具库的源码实现 examples C++语言框架的示例代码,包括:快速入门示例、promise编程入门示例、压测程序示例 unittest tars cpp rpc框架的单元测试用例,...

    IDL精髓美 Martin Gudgin

    本书向读者提供了IDL的详细描述及如何使用IDL方面的知识,基于示例、由浅入深地阐述了各种IDL...第二部分的4个章节则提供了一个IDL类型、修饰符、关键字及属性的参考。 本书适合使用COM、微软事务服务器(MTS)、C++或

    Creating a Template Interface in IDL with its Template Imple

    Creating a Template Interface in IDL with its Template Implementation in C++用IDL创建一个模板接口并用C++实现模板(6KB)

    IDL精髓

    IDL精髓详细描述如何使用IDL方面的知识 实例由C++和VB实现

    c++调用com的方法

    使用vs2008简单编写了一个com组件dll,后用vs2008分别用4中方法进行调用,方法详解在http://blog.csdn.net/angellove156/article/details/25633421

    febird C++ 库(附带所有源码)

    该库也实现了一个不需要IDL的rpc,使用几个宏,很方便的自动完成函数参数的序列化,比MFC的MessageMap?还要方便。 使用时请checkout最新版,下载的那个版本比较旧了 @see ...

    Visual C++ 编程资源大全(英文源码 ActiveX)

    31.zip Creating a Template Interface in IDL with its Template Implementation in C++ 用IDL创建一个模板接口并用C++实现模板(6KB)&lt;END&gt;&lt;br&gt;32,32.zip Building a World Class Application with MFC and...

    Visual C++实践与提高-COM和COM+篇『PDF』

    6.3.1 创建一个进程内自动化组件工程 6.3.2 分析新建工程文件 6.3.3 添加COM对象类 6.3.4 为接口添加属性 6.3.5 为接口添加方法 6.3.6 创建并测试组件 6.4 探讨MFC实现COM的内幕 6.4.1 MFC COM对象的实现 6.4.2 MFC ...

    RPC的实现

    介绍RCP的实现原理 目录 1. 前言 2 2. 基本概念 3 2.1. IDL 3 2.2. 代理(Proxy) 3 2.3. 存根(Stub) 4 3. 三要素 4 3.1. 网络通讯 4 3.2. 消息编解码 5 3.3. IDL编译器 5 4. flex和bison 5 4.1. 准备概念 5 ...

    该工程是Tars RPC框架C++语言的源代码

    该工程是Tars RPC框架C++语言的源代码 , C++语言框架rpc的源码实现,C++语言框架IDL工具的源码实现 。

    Chromium WebGPU 的硬件光线追踪扩展_C++_代码_相关文件_下载

    更准确地说,它实现webgpu.h了与 WebGPU IDL 的一对一映射。Dawn 旨在作为更大系统的一部分集成,并且是 Chromium 中 WebGPU 的底层实现。 Dawn 提供了几个 WebGPU 构建块: 应用程序和其他构建块使用的 WebGPU C/...

    计算机程序的正确定义

    C++源程序可以在Visual C++ 6.0里编写,也可以在记事本里编写,而同一个C++源程序可以用Visual C++ 6.0编译、执行,也可以用C++ Builder 5.0编译、执行,所以: C++ 不等于 Visual C++ 6.0 。  第二阶段:掌握一种...

    COM技术初探(pdf格式)

    1.1 创建一个类型为win32 dll工程 1.2 定义接口文件 1.3 增加注册功能 1.3.1 增加一个MathCOM.def文件 1.3.2 DllRegisterServer()和DllUnregisterServer() 1.4 MathCOM.cpp文件 1.5 小结 2. 实现ISmipleMath,...

    C#如何调用原生C++ COM对象详解

    最近在工作中遇到一个问题,为了跨平台在.net core中使用COM,不能使用Windows下的COM注册机制,但是可以直接把IUnknown指针传给C#,转换为指针,再转换为C#的接口(interface)。 做了这方面的研究,但最终我没有...

    利用C++ ATL技术实现反射机制

    但由于C++本身没有成熟的反射技术,对此进行了深入研究并提出一种实现方法。首先论述了反射机制的作用;然后描述了ATL动态链接库实现反射机制的基本原理,完善了ATL IDL文件接口标识符定义,利用前绑定或后绑定技术...

    thrift-0.2.0

    Thrift通过一个中间语言(IDL, 接口定义语言)来定义RPC的接口和数据类型,然后通过一个编译器生成不同语言的代码(目前支持C++,Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk和OCaml),并由...

    omniORB-4.1.0.rar

    omniORB是CORBA(公用对象代理体系架构)的一种开发库,主要适用C++和python。CORBA 实现了异构系统的异种语言软体合并、协作。 CORBA的大体实现方式:使用IDL实现与其它编程语言的映射;客户端与服务端使用GIOP (主要...

    VC++ COM组件开发相关实例

    2.1 C++实现接口的方式,使用抽象类 定义接口. 2.2 基于抽象类,派生出子类并实现 功能. 2.3 使用 interface 定义接口 interface ClassA { }; 目前VC中,interface其实就是struct 3 接口的动态导出 3.1 ...

    使用回调接口实现ActiveX控件和它的容器程序的通讯

    所谓基于COM的回调虚接口实现ActiveX控件和客户端程序的通讯,大致是这样的,就是在ActiveX工程的内部的idl文件定义一个虚接口,在客户端程序定义一个虚接口的派生类来实现回调函数,在客户端程序传递派生类对象指针...

Global site tag (gtag.js) - Google Analytics