我已经编写 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++ 标准支持?