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

时间:2013-06-21 21:53:46

标签: c++ com

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

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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