Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是一个COM对象a C++;上课? 我读了两篇文章,描述COM对象基本上是C++类。这是真的吗?以下是我正在阅读的一篇文章:_C++_C_Com - Fatal编程技术网

是一个COM对象a C++;上课? 我读了两篇文章,描述COM对象基本上是C++类。这是真的吗?以下是我正在阅读的一篇文章:

是一个COM对象a C++;上课? 我读了两篇文章,描述COM对象基本上是C++类。这是真的吗?以下是我正在阅读的一篇文章:,c++,c,com,C++,C,Com,它描述了在C中创建COM对象的方法。COM强制此结构的第一个成员是某些函数指针 我不知道COM对象和C++之间的具体相关性,尽管我能理解关系很容易理解。 IMO,这取决于如何定义COM对象。如果COM对象是与COM二进制接口兼容的任何对象,那么对象是否在C++内部实现是一个实现细节。它可以在C++中实现,但也可以用其他各种方式来实现,只要通过COM接口访问它,它就几乎不相关。 正如亚当和WhozCraig指出的那样,COM的二进制接口是用MSVC的C++编译器设计的。在MSVC C++中编写CO

它描述了在C中创建COM对象的方法。COM强制此结构的第一个成员是某些函数指针


<>我不知道COM对象和C++之间的具体相关性,尽管我能理解关系很容易理解。

IMO,这取决于如何定义COM对象。如果COM对象是与COM二进制接口兼容的任何对象,那么对象是否在C++内部实现是一个实现细节。它可以在C++中实现,但也可以用其他各种方式来实现,只要通过COM接口访问它,它就几乎不相关。


正如亚当和WhozCraig指出的那样,COM的二进制接口是用MSVC的C++编译器设计的。在MSVC C++中编写COM对象是创建COM对象的“原始”方式。所以这两个系统肯定有交织的历史,并且COM二进制接口规范与MSVC如何部署C++对象有很多共同点。但是,MSVC编译器仍然需要生成COM绑定作为一个“额外”编译步骤(例如COM Type和C++导入头,因此其他C++项目可以导入COM库)。它是一个库,使用类ID(CLSID)标识的不同类型的组件构建,类ID是全局唯一标识符(GUID)。每个COM组件通过一个或多个接口公开其功能。组件支持的不同接口使用接口ID(IID)相互区分,接口ID也是GUID。

COM准确指定其对象的布局方式:将虚拟函数表指针(也称为vtable指针)作为对象中的第一个成员。它的设计是为了让微软编译器能够显示C++对象,这样就可以有一个C++类,它与手工定义的C结构一样编译。

只要使用微软编译器,那么,是的,COM对象基本上是C++类实例。但是如果使用不同的编译器,则需要特别注意以确保以相同的方式布置C++对象。只要不使用多重继承或虚拟继承,大多数编译器都会将vtable放在第一位,因此它通常会工作,但有些编译器会将vtable放在最后。确保读取编译器的文档并找出它是否兼容COM。

< P> COM对象规范是设计用来利用C++对象的已有二进制布局,因此在这方面,它们是基于C++类的。

创建IDISPoT接口,以便使用不能使用C++ VTABLE的语言更容易使用COM。它增加了一个额外的间接调用COM调用的层。< /P> < P>添加另一个答案,因为我认为还有一些有用的事情要知道COM和C++的答案,其他答案没有涵盖。 也许有三件重要的事情需要得到:

  • COM对象实际上是COM接口的集合,这些接口相互协作,以提供具有共享COM对象标识的外观(您可以从任何接口向任何其他接口发出QI,其中一个接口是您随时为IUnknown发出QI的接口,也称为“规范未知”)

  • <> > com接口恰好与C++对象的VTABLE具有相同的布局,如MSVC和所有(AFAIK)Windows编译器所实现的。

  • COM更关注接口。C++更注重类。

第二个是在C++中实现COM对象的简单方法。但第一个意思是,这个主题有很多变化。所以你可以:

    >P>一个接口C++ COM对象,它是在C++中实现的一个接口,实现了一个接口

    > P>一个具有多个接口的COM对象,它是用C++的多继承继承实现的C++类,它是

    > P>一个具有多个接口的COM对象,它实现了一个协作的C++对象实例集合,或者每个COM接口的一个C++类;或者一个C++类实现COM对象的大部分接口,并使用辅助器C++类来实现不常用的接口,也许只需要根据需要创建这些帮助器C++类!(请注意,这与COM聚合是分开的。)

最后一个案例特别有趣,因为它说明了一个COM对象可以在实现中映射到几个C++对象。COM不在乎,只要您遵循它的规则(特别是关于refcounting,QI应该是关联的、自反的和传递的,并且所有COM对象都应该有一个规范的IUnknown)

<>尽管在C++中实现COM对象相当简单,但您不能假设您所掌握的任何COM对象实际上是一个C++类,它可以在C、汇编程序中实现,或者是一个动态生成的代码,它是一些C代码的包装器。
<>记住,C++特性,例如RTTI和C++异常不是COM的一部分,所以你不能用它们来对付任意的COM对象——除非你知道它实际上是你自己的C++类之一,在这种情况下,你实际上是在使用C++中的对象,而不是作为COM对象。不,任何有幸用原生C编写COM对象的人都会证明这一点。由于VTPLE布局,C++使COM对象更容易编写,但不需要C++编写它们。事实上,你甚至不需要C语言,VB和C的工程师们会很高兴地承认这一点。这篇文章解释得很好。@JesseGood发现得不错。伙计