.H头文件和IDL文件的不同用途是什么?

时间:2010-04-12 17:30:44

标签: c++ com

我正在学习COM,所以有些基本问题困扰着我......

我知道IDL文件用于描述方法定义(或软件模块之间所谓的“契约”),而.H头文件包含的方法原型类似于IDL的含义对于。那么,为什么这两件事并存?还不够吗?

非常感谢。

4 个答案:

答案 0 :(得分:8)

接口描述语言(IDL)本身就是一种小语言,它提供了一种独立于编程语言的方式来描述接口。工具从.idl生成.h文件。

如果你只有一个.h文件,就不可能用另一种编程语言来绑定它。 .h文件非常特定于C和C ++代码。

其他一些差异是.h文件中你有时可以实现实现以及声明,以及类成员变量。而在IDL中,您严格定义了一个接口。

答案 1 :(得分:1)

From Wikipedia:

  

接口描述语言(或   或者,接口定义   语言),或简称IDL,是一个   用于的规范语言   描述一个软件组件   接口。 IDL描述了一个接口   以语言中立的方式,启用   软件之间的通信   不共享的组件   语言 - 例如,之间   用C ++编写的组件   用Java编写的组件。

另一方面,.H文件由C / C ++编译器专门用于生成代码对象。所以,它们是特定于语言的。

答案 2 :(得分:1)

<。> .h文件是一个头文件,允许包含类,结构等的声明。它处理编译器问题,并处理本地代码。 另一方面,当你有不同的实体需要通信时,就像在CORBA的情况下一样,你需要处理可以在不同地址空间的实体之间传递的数据,比如在同一台计算机上运行的两个不同的程序,甚至在不同的电脑上。所有这些程序都可以用完全不同的语言编写,但它们必须能够进行通信。 IDL允许您定义这些组件通过ORB通信通道导出到世界的接口。组件级别高于类级别。为简化起见,组件可视为执行复杂任务的类的聚合。

IDL以独立于语言/平台的方式描述软件组件的接口,将实现任务委派给供应商特定工具。这些工具将IDL定义转换为被调用者的实际类(包括其包含),以及可以编译并链接到调用者的“存根”类。存根类公开IDL中定义的远程被调用者服务的接口,但除了通过ORB将请求发送到远程服务并将结果处理回调用者之外,它不执行任何任务。

编辑:在评论中的答案

  

谢谢Stefano。所以,IDL绝不是   另一个“标准”受到尊重   各种语言,不同   IDL感知语言有自己的   用于理解IDL文件的工具   把它转换成可以理解的   格式,例如C ++头文件   包含ORB类声明。   我现在好吗?

是和否。 IDL是表示组件接口的标准,用于进程间通信的导出接口(以及许多其他东西)。 OMG小组(在corba和idl的标准化背后)也有idl概念和各种语言之间的映射:见http://www.omg.org/technology/documents/idl2x_spec_catalog.htm

您不能说IDL是一种语言所尊重的标准。 IDL是一种高级别的表达方式,您可以手动地痛苦地做。您可以将它视为高级语言(如C)和低级语言(如汇编程序)之间的相同概念。编译器接受C代码并为目标体系结构创建汇编代码(x86,sparc,等等)。 类似地,CORBA供应商(不是编译器供应商)提供的解析IDL的工具会生成特定于语言的结果,允许您跳过编码无聊的CORBA低级别详细信息。

现在,我不知道COM世界是怎样的,但是作为COM的ripoff(或者我听说过),概念应该是相同的。

答案 3 :(得分:0)

可以编译IDL文件以产生一些有用的东西。

您可以获得带有接口和常量的头文件和C源文件,您可以使用这些接口和常量来实现应用程序中的接口,或者在其他实现中使用已实现的接口。

您还可以将IDL文件编译到类型库中,这本身就是一个非常有用的东西。您可以将类型库导入到不同的语言中以使用COM对象。您可以将类型库包含到COM服务器资源中,这可以为您提供自动编组功能,使您可以在进程内服务器中从进程内服务器中进行编写,而无需编写任何内容。如果COM服务器资源中有类型库,也可以使用ATL模板在COM服务器中进行后期绑定实现,而无需编写任何内容。