将COM对象作为引用在模块内传递

Passing COM objects as references within module

本文关键字:模块 引用 COM 对象      更新时间:2023-10-16

是否有任何原因或约定不将COM对象作为内部函数的引用传递?

我知道COM API中不能使用引用,因为这会破坏二进制兼容性。但是在模块内呢?

通过引用非COM函数来传递COM对象是完全可以的。尽管引用只是对象的别名,但它们通常被实现为隐藏的指针。

问题很可疑,对象和接口之间的区别在COM中很重要。使用COM服务器的客户端代码只能使用接口指针。CoCreateInstance()在服务器上创建一个对象,并返回一个指向coclass实现的接口之一的接口指针。就像IUnknown*。你从来没有处理过一个物体。Boilerplate将接口指针保留为指针,通过引用传递它们并不是很有用。您可以将它们封装在一个智能指针类中,这样Release()调用是自动的。通过引用传递智能指针对象是可以的,它与COM.没有任何关系

在COM服务器中可能有所不同。您通常使用实现COM接口的C++类来实现那里的对象。如果该服务器中的代码需要对该对象的引用,那么只传递对C++对象的引用是有意义的。这只是C++中引用的标准用法,与COM无关。