`
qiezi
  • 浏览: 497228 次
  • 性别: 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和Visual_C++的混合编程

    在Windows操作系统环境下,实现IDL与Visual C++的混合编程主要有以下几种方法: 1. **动态链接库(Dynamic Link Library, DLL)调用** - IDL可以编译生成DLL文件,这些DLL文件可以在Visual C++中被调用。 - 通过...

    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框架的单元测试用例,...

    Calling C from IDL(2002)

    《Calling C from IDL》是2002年发布的一份文档,主要探讨了如何在IDL(Interactive Data Language)环境中调用C和C++代码。IDL是一种强大的数据处理和可视化语言,广泛应用于科学计算和数据分析领域。而C和C++是...

    VC++调用IDL的使用案例

    这个接口定义了一个名为`IMyInterface`的方法`MyMethod`,接受一个long类型的参数并返回一个BSTR类型的值。 步骤2:编译IDL 使用MIDL工具,将`.idl`文件转换为C++代码。在命令行中,执行以下命令: ```bash midl ...

    用C++实现Corba

    《用C++实现Corba》是一本针对初学者和进阶者全面介绍如何使用C++语言来实现CORBA(Common Object Request Broker Architecture,公共对象请求代理架构)的优秀教程。这本书详细阐述了CORBA的核心概念、设计原则以及...

    基于C++的CORBA实现

    - **多线程支持**:由于CORBA通常用于构建并发系统,因此C++实现时需考虑多线程问题,确保线程安全。 **3. CORBA的主要优点** - **平台和语言无关**:CORBA标准允许在不同操作系统和编程语言之间进行通信,促进了...

    IDL精髓.pdf

    例如,const修饰符用于声明常量,指出一个变量的值一旦被赋值后就不能被改变;signed和unsigned则分别用于指定有符号和无符号整型。修饰符在类型库中的描述情况和它们能修饰的类型范围是这类内容的关键知识点。 第9...

    omniorb idl 文件编译示例

    在这个例子中,`MyModule`模块包含一个名为`MyService`的接口,该接口有一个返回字符串的`sayHello`方法。 要使用omniORB编译这个IDL文件,你需要执行以下步骤: 1. **安装omniORB**: 首先,确保你的系统上已经...

    IDL精髓美 Martin Gudgin

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

    基于IDL和VisualC_的混合编程

    - 示例:假设有一个IDL编写的用于数据预处理的程序,可以将其封装为一个DLL,然后在Visual C++中通过LoadLibrary和GetProcAddress等函数调用该DLL中的特定函数。 2. **COM组件技术**:利用IDL提供的COM组件功能,...

    基于C语言实现的IDL编译器.pdf

    基于C语言实现的IDL编译器的知识点主要包括以下几点: 1. CORBA规范:IDL编译器是基于公共对象请求代理结构(CORBA)规范实现的。CORBA规范是一种中间件标准,用于分布式对象计算。它允许透明地访问远程对象,并...

    c++开发一个简单累加的COM组件

    1. 创建COM项目:使用VS2010创建一个新的ATL COM项目,选择“Visual C++” --&gt; “ATL 项目”,填写项目名称为“FirstCOM”。 2. 添加COM接口:在类视图中,右键单击项目“FirstCOM” --&gt; “添加” --&gt; “类”,添加...

    IDL和Visual C混合编程

    这种方式通常通过创建一个DLL或者ActiveX控件来实现。 **2.1 创建动态链接库** - **编写DLL**:使用VC++编写DLL,并导出需要在IDL中使用的函数。 - **IDL中调用DLL**:在IDL程序中加载DLL并通过调用相应的函数来...

    idl.rar_IDl_idl POLYFILL_idl教程

    idl.rar 是一个包含有关IDL(Interface Definition Language)学习资源的压缩包文件,主要针对IDL的基础知识和Polyfill的使用。IDL通常用于定义不同软件组件之间的接口,尤其在分布式系统和跨平台应用程序中扮演着...

    归一化植被指数IDL程序实现

    归一化植被指数(Normalized Difference Vegetation Index, NDVI)是一种广泛应用在遥感...通过这些知识的学习和实践,初学者可以逐步掌握如何利用IDL和CUDA实现高效的NDVI计算,从而更好地进行植被监测和环境研究。

    IDL可视化分析与应用(随书程序)

    总之,《IDL可视化分析与应用》一书结合随书程序,为学习者提供了一个全面了解和实践IDL的平台,无论是初学者还是经验丰富的专业人士,都能从中获益匪浅,提升数据处理和可视化的专业能力。通过深入学习和实践这些...

    IDL.rar_IDl

    例如,给定一个`.idl`文件,源码生成器可以生成C++或Java类,这些类包含了与IDL定义相对应的函数和数据结构。 **使用过程** 1. **定义接口**:首先,开发者需要使用IDL语言编写接口定义文件,明确服务的输入、输出...

    Eclipse-IDL编译插件.zip

    Eclipse IDL(Interface Definition Language)编译插件是针对Eclipse集成开发环境的一个扩展工具,主要用于处理CORBA(Common Object Request Broker Architecture)相关的IDL文件。IDL是一种用于定义分布式系统间...

Global site tag (gtag.js) - Google Analytics