当前位置:首页 > 芯闻号 > 充电吧
[导读]Question:什么是IDL和MIDL? Answer:IDL是接口定义语言。MIDL是Microsoft的IDL编译器。 在用IDL对接口和组件进行了描述后,可以用MIDL进行编译,生成相应的代理

Question:

什么是IDL和MIDL?

 

Answer:

IDL是接口定义语言。

MIDL是Microsoft的IDL编译器。

 

在用IDL对接口和组件进行了描述后,可以用MIDL进行编译,生成相应的代理和存根DLL的C代码。

 

一个例子:

import “unknown.idl” ///用于将其他IDL文件中的定义包含到当前文件中

///Interface IX

[ ///注意是[ ]不是 {}

object, ///所定义的接口是一个COM接口

uuid(32bb8323-b41b-11cf-a6bb-0080c7b2d682), ///相应的接口IID

helpstring(“IX Interface”), ///将帮助串放入类型库

pointer_default(unique) ///这类指针可以为空,函数内可以修改它们的值,但不能指定别名

]

interface IX:IUnknown

{

///in关键字告诉MIDL需要将此参数值从客户传递给组件,存根代码不需要送回任何值。

HRESULT FxStringIn([in,string]wchar_t* szIn);

///out关键字告诉MIDL参数仅被用来从组件向客户传回有关的数据,

///代理不需要对输出参数进行列集,也不需要将参数传给组件。

HRESULT FxStringOut([out,string]wchar_t* szout);

///COM对字符串的标准约定是Unicode字符(即wchar_t)

}

IDL文件可以定义C和C++风格的结构,并可用它们作为函数的参数。

当IDL文件中有一个library时,MIDL将生成一个类型库。

MIDL为接口生成相应的代理和存根的C代码。

为得到一个代理/存根DLL,需要编译和链接MIDL生成的C文件。

宏REGISTER_PROXY_DLL将完成代理/存根DLL在注册表中的注册操作。

 

有了IDL和MIDL我们就可以象调用进程内组件那样进行跨进程边界的函数调用,并对参数进行列集(marshal)。

 

Question:

什么是代理和存根DLL?

 

Answer:

客户与一个模仿组件的DLL进行通信,这个DLL可以完成参数的列集,此组件被称为代理。

一个代理就是同另一个组件行为相同的组件。

代理必须是DLL形式。

组件还需要一个存根的DLL,以便对从客户传来的数据进行散集。

存根也将对传回给客户的数据进行列集。

 

 

接口定义语言(IDL)简介

1.ATL不为实现类创建虚函数表,因此初始化成员放在一个公共的函数中(啥意思?!).
2.IDL(接口定义语言)
3.IDL文件由MIDL编译器编译。
4.IDL基础:
接口定义语言是一种方法,通过这种方法,可以定义COM对象所支持的接口。一个COM对象的IDL文件主要包括两个

主要的元素:接口声明和类型库声明。
5.接口
接口是COM组件的一个关键部分,由关键字interface定义。接口的属性包括:

object, uuid(), helpstring(), pointer_default()。

Istopwatch : public IUnknown
{
...
}
以后无论那里使用uuidof(IStopwatch)即可,例如
hr = CoCreateInstance(_uuidof(TIMERSlib::Stopwatch,NULL,CLSCTX_INPROC_SERVER,_uuifof(IStopwatch),void**&pStopwatch));
将返回与接口相关联的GUID。宏_declspec(novtable)是微软专用的,用作防止创建虚函数表的优化。

6.方法:
COM方法的一般形式为:[attributes]HRESULT name(param_list)

7.参数
主要分析3个参数in,out,retval。这三个参数中in,out是最重要的,这些属性表示了参数传递数据的方向。retval属性是一种方便的将数据返回给客户端程序的方法。

 

OMG 接口定义语言(IDL)

 

用 RPC / COM /CORBA 技术来编写分布式系统时都需要接口定义语言 (IDL)。

IDL特点:

1、IDL 是一种规范语言。

2、IDL 看上去很像 C 语言。

3、OMG IDL 的目的是定义接口和精简分布对象的过程。

4、IDL分离对象的接口与其实现。

5、IDL剥离了编程语言和硬件的依赖性。

6、使用IDL定义接口的客户机程序员不知道接口背后的实现细节。

7、IDL提供一套通用的数据类型,并以这些数据类型来定义更为复杂的数据类型。

 

本文讲解 OMG IDL 的内置类型和关键字。

OMG 接口定义语言内置类型表:

类型 范围 最小大小(bit) 

short -215 到 215-1 16 

unsigned short 0 到 216-1 16 

long -231 到 231-1 32 

unsigned long 0 到 232-1 32 

long long -263 到 263-1 64 

Unsigned long long 0 到 264-1 64 

float IEEE 单精度 32 

double IEEE 双精度 64 

long double IEEE 双字节扩展浮点数 15 位指数,64 位带符号小数 

char ISO Latin-1 8 

wchar 从任何宽字符集编码宽字符,如 Unicode 依赖于实现 

string ISO Latin-1,除了 ASCII NUL 以外 可变化 

Boolean TRUE 或 FALSE 未指定 

octet 0 到 255 8 

any 自己描述的数据类型,可表示任何 IDL 类型 可变化 

 

IDL 基本类型

整数类型

OMG IDL 摒弃int 类型在不同平台上取值范围不同带来的多义性的问题。

IDL提供2 字节 (short)、4 字节 (long) 和 8 字节 (long long) 的整数类型。

所有这些整数类型都有相应的无符号数类型。

浮点类型

OMG IDL 浮点数类型 float、double 和 long double。

OMG IDL 遵循 IEEE 754-1985 二进制浮点数算术的标准。

目前,long double 用于巨大数字,有些语言映射还不支持这种类型。

char 和 wchar

IDL标准字符集:词法约定(表示 IDL 文件的关键字、注释和文字的字符记号)规定 ISO 8859.1 字符集表示 IDL 文件中的字符。ISO 464 定义了空字符(null)和其它图形字符。

OMG IDL必须处理从一个计算机系统到另一个计算机系统之间的字符传输。从一个字符代码集到另一个字符代码集的转换,取决于语言绑定。

OMG IDL char 是一个 8 位变量,可以用两种方法表示一个字符。

首先,它可以从面向字节的代码集编码单字节字符。

其次,在数组中使用时,可以从多字节字符集(如 Unicode),编码任何多字节字符。OMG IDL Wchar 只允许大于 8 个字节的代码集。规范不支持特殊的代码集。

OMG IDL Wchar允许每个客户机和服务器使用本机的代码集,然后指定如何转换字符和字符串,以便在使用不同代码集的环境之间进行传输。

Boolean

Boolean 值只能是 TRUE 或 FALSE。

Octet

octet 是 8 位类型,一种非常重要的类型。

octet 在地址空间之间传送时不会有任何表示更改。octet 在发送二进制数据,并且将它打包时,它的形式仍然相同。其它每种 IDL 类型在传输时都有表示变化。例如,根据 IOR 代码集信息的指示,char 数组会经历代码集转换。而 octet 数组却不会。

any 类型

IDL any 是一种包含任何数据类型的结构。

IDL any由类型码和值组成。类型码描述 any 的值的内容。

IDL any该类型可以是 char 或 long long 或 string 或另一种 any,或者是已经创建的一种类型,如 Address。

IDL any 类似于C++ 的自我描述数据类型void *,但它更安全。

IDL any 类似于 Visual Basic的用户定义的类型variant。

 

OMG IDL提供自定义数据类型,可以是枚举、结构和联合,或者用 typedef 创建的新类型。

命名的类型

应该使用 typedef 创建新的类型名称,这将帮助解释接口或保存输入。

例如, typedef float AtmosPressure;

在文体上,应注意不要为现有类型创建别名。CORBA 规范不保证 short 的两种 typedef 是兼容的和可互换的。

OMG IDL typedef 关键字具体含义取决于其所映射到的实现语言。在 C++ 中,typedef 关键字表示类型定义,实际上别名也许是更为精确的术语。

枚举

OMG IDL 枚举是将名称附加到数字的一种方法,从而了解代码更多的含义。

OMG IDL 版的枚举看上去象 C++ 版本的枚举。

例如, enum CloudCover{cloudy, sunny};

CloudCover 现在就成为可以在 IDL 中使用的一种新类型。

枚举最多有 232 个标识。

规范中没有规定标识的有序数值。

OMG IDL 不允许空的枚举。

结构

struct 关键字提供了将一组变量集中到一个结构的方法。

例如,

struct Date {

               short month;

               short day;

               long year;

};

定义 struct 时,要确保所创建的类型是可读的。

不要在不同的名称空间中创建几个不同的同名结构,会使 IDL 的用户糊涂。

识别联合

联合是 C 联合类型和 switch 语句的混合物。

联合必须有类型标记字段。

一次只能有一个联合成员是活动的,并且可以从其识别名称来确定该成员。

例如,

enum PressureScale{customary,metric};

 

union BarometricPressure switch (PressureScale)

{

 case customary :

    float Inches;

 case metric :

 default:

    short CCs;

};

 

在以上示例中,如果识别名称是 metric,或者使用了不能识别的识别名称值,那么 short CCs 就是活动的。如果识别名称是 customary,那么 float 成员 Inches 是活动的。联合成员可以是任何类型,包括用户定义的复杂类型。

识别名称类型必须是整数类型(short、long、long long 等,以及 char、boolean 或 enumeraton)。

常数定义

常数可以是整数、字符、浮点数、字符串、Boolean、octet 或枚举型,

 不能是 any 类型或用户定义的类型。

例如,

const float MeanDensityEarth = 5.522;      // g/cm^3

const float knot = 1.1508;                 // miles per hour

const char NUL = '';

可以用十进制、十六进制或八进制记数法定义整数常数:

例如,

const long ARRAY_MAX_SIZE = 10000;

const long HEX_NUM = 0xff;

对于指数和小数,浮点字符使用常用的 C++ 约定:

例如,

const double SPEED_OF_LIGHT = 2.997925E8;

const double AVOGADRO = 6.0222E26;

字符和字符串常数支持标准换码序列:

例如,

const char TAB = 't';

const char NEWLINE = 'n';

只要没有混合的类型表达式,就可以在常数说明中使用算术运算符。

用户异常

异常类似于一个结构,从方法中使用异常。

例如,

exception DIVIDE_BY_ZERO {

 string err;

};

 

interface someIface {

 long div(in long x, in long y) raises(DIVIDE_BY_ZERO);

};

异常将创建名称空间。

异常中的成员名必须是唯一的。

异常不能当作用户定义类型的数据成员使用。

OMG IDL 中没有异常继承。

数组、序列和字符串

每次只传送一个元素是可以的。

一种语言的数组与另一种语言的数组实现通常是不同的。

OMG IDL数组类型IDL array 和 sequence,可以轻易地被映射到实现语言中。

string 类型是一种特殊的序列,它允许语言使用它们的字符串库和优化。

数组

OMG IDL 有任意元素类型的多维固定大小的数组。

所有数组都是有界的。

数组非常适合于与拥有固定数量元素的列表一起使用,而这些元素通常都是存在的。

例如,

// bounded and unbounded array examples

typedef long shares[1000];

typedef string spreadsheet[100][100];

 

struct ofArrays {

 long anArray[1000];

};

 

// unbounded arrays NOT ALLOWED

// typedef long orders[];

必须指定数组维数,并且必须为正的整型常量来表示。

IDL 不支持在 C 和 C++ 中的开放数组。

IDL没有指针支持。

IDL必须出现 typedef 关键字,除非指定的数组是结构的一部分。

IDL不以任何方式、形态或形式指定数组下标编排方法。

一种实现语言到另一种实现语言的数组下标可以是不同的。

不能假定将数组下标从客户机发送到服务器时,服务器会调整并指向正确的数组元素。

某些语言的数组下标从 0 开始,而其它的则是从 1 开始。

序列

序列是变长向量,它有两个特征:元素的最大大小,在编译时确定,可以是无限的;

长度,在运行时确定。

序列可以包含所有类型的元素,不管是基本类型还是用户定义的类型。

序列可以是有界的,也可以是无界的。

例如,

// bounded and unbounded sequence examples

typedef sequence

typedef sequence

一个无限序列可以拥有任意多个元素,只会受到平台内存大小的限制。

有限序列则有边界限制。

无限序列和有限序列都可以不包含元素、用户定义的类型,但可以包含其它序列。

string 和 wstring

string 等价于 char 的序列,而 wstring 表示 wchar 的序列。

作为 C 和 C++ 的折衷,OMG IDL string 和 wstring 可以包含任何字符,除空字符以外。

char 或 wchar 约定确定了类型为 string 的元素大小由 8 个字节表示。

wstring 类型的元素大小是 16 个字节或更多。

IDL 中的字符串很特殊,OMG 允许语言映射使用特殊优化,这些优化不会与通用序列一起处理。

名称和作用域

 OMG IDL 标识都是区分大小写的。

IDL只有一个全局作用域。

整个 OMG IDL 内容和通过预处理器伪指令传入的所有文件共同组成了命名作用域。

任何未出现在某个作用域中的定义都是全局作用域的一部分。

在全局作用域中,以下定义组成了作用域:module、interface、struct、union、operation 和 exception。

module 关键字唯一目的是创建名称空间。

一个标识可以在一个作用域中定义一次,但可以在嵌套作用域中重新定义。

module States {

 // error: redefinition

 // typedef sequence

 

 module Pennsylvania {

    typedef string river;

    interface Capital {

      void visitGovernor();

    };

   };

 module NewYork {

    interface Capital {

      void visitGovernor();

    };

    interface Pennsylvania {

      void visit();

    };

 };

 module NewJersey {

    typedef Pennsylvania::river NJRiver;

    // Error

    // typedef string Pennsylvania;

    interface Capital {

      void visitGovernor();

    };

 };

};

 

接口

接口指定了服务实现和使用它的客户机之间的软件约定。

一个回调的例子。

// Thrown by server when the client passes

// an invalid connection id to the server

exception InvalidConnectionIdException

{

 long invalidId;

};

 

// This is the callback interface that

// the client has to implement in order

// to listen to a talker.

interface Listener

{

 // Called by the server to dispatch messages on the client

 void listen(in string message);

 

 // Called by the server when the connection

 // with the client is successfully opened

 void engage(in string person);

 

 // Called by the server when the connection with the client is closed

 void disengage(in string person);

};

 

// interface on the server side

interface Speaker

{

 // Called by the client to open a new connection

 // Returned long is the connection ID

 long register(in Listener client, in string listenerName);

 

 // Makes the server broadcast the message to all clients

 void speak(in long connectionId, in string message)

    raises(InvalidConnectionIdException);

 

 // Called by the client to sever the communication

 void unregister(in long connectionId)

    raises(InvalidConnectionIdException);

};

接口名称变成类型,可以当作参数传送。实际是对象引用。

每个对象引用 (IOR) 仅指向一个接口。

IDL 接口对应于类定义,CORBA 对象对应于类实例。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭