C和C+中的CoCreateInstance函数签名+; 我已经编程了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和C+中的CoCreateInstance函数签名+; 我已经编程了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++,C++,而在C中,签名变为 unsigned __int32 CoCreateInstance(const CLSID* clsid, IUnknown* pUnkOuter, unsigned __int32 dwClsContext, const IID* iid, void* ppv); 在Ole32.dll中,CoCreateInstance只有一个条目,这意味着两个声明指向同一个实现 是微软扩展还是C++标准支持?首先要理解的是,C语言与C语言非常相似,但它是一种不同于C++的语言。现在来看

而在C中,签名变为

unsigned __int32 CoCreateInstance(const CLSID* clsid, IUnknown*
pUnkOuter, unsigned __int32 dwClsContext, const IID* iid, void* ppv);
在Ole32.dll中,CoCreateInstance只有一个条目,这意味着两个声明指向同一个实现


是微软扩展还是C++标准支持?

首先要理解的是,C语言与C语言非常相似,但它是一种不同于C++的语言。现在来看CoCreateinstance()函数。我看到的唯一区别是,签名在C++中使用XXX和通过引用,而在C.

中使用XXX *。
理论上,这是正确的。为了能够改变传递的参数的值,C使用传递内存位置,因此如果调用方函数需要,它可以改变参数的值。虽然C++也可以通过传递内存位置来传递一个参数,但它有一个更好的机制来实现同样的目的。它通过引用传递值。所以对我来说,尽管它们看起来不同,但功能是相同的

本标准将此定义为实施,引用:

<> Linkage从C++到其他语言定义的对象,以及C++语言中定义的对象,都是由实现定义和语言依赖的。只有当两种语言实现的对象布局策略足够相似时,才能实现这种链接
如何检查Ole32.dll中的CoCreateInstance只有一个条目?我认为C++的名字可以被修改。这是故意的,在GuDeff.h SDK头文件中找到宏。在运行时,引用和指针之间没有区别。我查看了一个程序中调用版本COCCREATEY实例的DsassMulle代码,并且在这两种情况下都调用Adess Adress代码(我在未命名命名空间中声明第二个函数,允许从C++代码调用它)。因此,在没有任何附加包装的情况下,函数是相同的,并且因为在运行时它们之间没有任何区别(至少在这种情况下),所以我可以用声明来调用CulCeAcess实例,其中一个参数通过引用传递,另一些则将通过指针(例如,从C和C++变体与头的差异)。.以上所有签名都是正确的,只有指向相同内容的宏定义。