我在创建 COM 接口时遇到问题。
我将其定义如下:
struct __declspec( uuid( "36244c2e-4883-47cb-9e02-5d4ea3cc38d9" ) )
IMyObject : IPersist, IPropertyBag
{
virtual void __stdcall DoObjectStuff() = 0;
};
HRESULT __stdcall CreateObject( IMyObject** myObject);
以及不完整的实施:
struct MyObject : IMyObject
{
// reference counter
long m_count;
MyObject()
:
m_count( 0 )
{
printf("Creating MyObject!\n");
}
// IUnknownInterface
virtual ULONG __stdcall AddRef() override
{
// ...
}
virtual ULONG __stdcall Release() override
{
// ...
}
virtual HRESULT __stdcall QueryInterface( REFIID riid, void** ppvObject )
{
ASSERT( ppvObject );
const auto id = riid;
if( id == __uuidof( IMyObject ) ||
id == __uuidof( IUnknown ) )
{
*ppvObject = static_cast<IMyObject*>( this );
}
else if( id == __uuidof( IPropertyBag ) )
{
*ppvObject = static_cast<IPropertyBag*>( this );
}
else if( id == __uuidof( IPersist ))
{
*ppvObject = static_cast<IPersist*>( this );
}
else
{
// unsupported interface
*ppvObject = nullptr;
return E_NOINTERFACE;
}
static_cast<IUnknown*>( *ppvObject )->AddRef();
return S_OK;
}
// IPersist
virtual HRESULT __stdcall GetClassID(CLSID* pClassID) override
{
// ...
}
// IPropertyBag
virtual HRESULT __stdcall Read( LPCOLESTR pszPropName, VARIANT* pVar, IErrorLog* pErrorLog ) override
{
// ...
}
virtual HRESULT __stdcall Write( LPCOLESTR pszPropName, VARIANT* pVar ) override
{
// ...
}
// IMyObject
virtual void __stdcall DoObjectStuff() override
{
std::cout << "Object stuff is being done!" << std::endl;
}
};
HRESULT __stdcall CreateObject( IMyObject** myObject )
{
// creates the object
}
IPropertyBag
和IPersist
都实现了IUnknown
,我是否也需要从IUnknown
显式派生我的接口?
我在这里面临的问题是,当我尝试创建一个对象时:
using namespace Microsoft::WRL;
ComPtr<IMyObject> myObject;
我收到错误 C2385,是什么原因?
它说问题出在
Release()
内部的 ComPtr
函数。
基于 IgorTandetnik 的建议:
限制
IMyObject
仅继承 IUnknown
,然后在创建从所有对象继承的对象时(IMyObject
、IPersist
、IPortable
)。