私は長年 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 のエントリが 1 つしかありません。つまり、2 つの宣言が同じ実装を指しています。
これは Microsoft 拡張機能ですか、それとも C++ 標準でサポートされていますか?