对于使用com对象的语言,是否需要为com开发特定的api和编译器?

时间:2012-02-11 06:06:00

标签: com

在com的文档中,它说它与每种语言完全一致。您是否需要为该语言提供特定的API,以便它可以与com进行交互,或者任何语言都可以直接使用它?你还需要一个特殊的编译器吗?很抱歉,如果这是一个愚蠢的问题,但我以前从未使用过,我一直试图找到这个答案。当我看到com示例的演示时,它似乎都以c风格语法访问对象,它们的绑定和其他语言的api(字面上都是)?

1 个答案:

答案 0 :(得分:1)

关于COM的关键是它是一个“二进制标准”:也就是说它不关心语言使用的是什么,只要内存中的位和字节最终在正确的位置。

COM基本上指定所有COM对象必须在内存中具有特定的布局:接口指针指向一个指针,该指针又指向一个函数指针表,该表至少有三个成员,前三个是指针到IUnknown函数(AddRef,Release,QueryInterface),其余部分是指向接口中其他函数的指针。 COM还指定了如何将参数传递给这些函数 - 以便调用者和被调用者就如何使用堆栈达成一致,以及谁将弹出值。

这个要求很高兴地与C ++恰好在Windows上运行的方式相匹配;因此,实现IUnknown的大多数C ++类最终都会成为有效的COM类:这是因为Microsoft的C ++实现恰好使用了与COM需要匹配的对象布局:C ++对象vtable指针与COM指针相同-to-table-of-function-pointers,函数指针的C ++表正是COM对其函数表指针所需要的,依此类推。 (这不仅仅是一个快乐的巧合:COM可能旨在利用C ++对象在内存中实现的最常见方式,这是MS编译器使用的技术。请注意,C ++语言规范实际上没有指定任何特定的对象布局 - 所以你可以有一个第三方C ++编译器,它以一种给你不能被COM使用的类的方式实现C ++。但没有正确思想的编译器供应商会这样做,因为它们看起来会被打破与其他人相比!)

在纯C中,您可以通过手动创建包含适当结构的指针来创建COM对象。这是有效的,因为C本质上允许您手动为结构指定二进制级内存布局;您可以创建您知道将具有COM期望的适当布局的结构。

在其他语言中,尤其是那些不允许用户明确指定内存布局的语言,您需要语言支持才能支持COM。所有.Net语言--C#,VB.Net等 - 都在.Net运行时使用支持来理解COM期望的内容,并根据需要生成适当的包装以允许互操作。

所以,长话短说,太阳下的任何语言都不会自动与COM合作;事实上,几种语言 - 即C和C ++ - 已经与COM的要求保持一致;大多数其他语言需要一些编译器支持才能使其正常工作。