我已经对COM函数进行了多年编程,今天我注意到实际上许多函数在C和C++中具有不同的签名。例如CoCreateInstance函数:

HRESULT CoCreateInstance(
  _In_   REFCLSID rclsid,
  _In_   LPUNKNOWN pUnkOuter,
  _In_   DWORD dwClsContext,
  _In_   REFIID riid,
  _Out_  LPVOID *ppv
);

在C++中,签名扩展为
unsigned __int32 CoCreateInstance(const CLSID& clsid, IUnknown*
pUnkOuter, unsigned __int32 dwClsContext, const IID& iid, void* ppv);

在C中,签名变为
unsigned __int32 CoCreateInstance(const CLSID* clsid, IUnknown*
pUnkOuter, unsigned __int32 dwClsContext, const IID* iid, void* ppv);

在Ole32.dll中,只有一个CoCreateInstance条目,这意味着两个声明指向相同的实现。

这是Microsoft扩展还是C++标准支持?

最佳答案

首先要理解,尽管C非常相似,但C是与C++不同的语言。现在进入CoCreateinstance()函数。我看到的唯一区别是签名使用xxx&或在C++中通过引用传递,而在C中使用xxx *。

从理论上讲,这是正确的。为了能够更改传递的参数值,C使用了传递存储位置,因此如果调用方函数需要,它可以更改参数的值。尽管C++也可以通过传递其内存位置来传递参数,但出于相同的目的,它具有更好的机制。它通过引用传递值。所以对我来说,尽管它们看起来不同,但功能是相同的。

08-05 17:31