无法使用 ComPtr 创建 COM 类的实例

问题描述 投票:0回答:1

我在创建 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
函数。

c++ windows winapi interface com
1个回答
0
投票

基于 IgorTandetnik 的建议:

限制

IMyObject
仅继承
IUnknown
,然后在创建从所有对象继承的对象时(
IMyObject
IPersist
IPortable
)。

© www.soinside.com 2019 - 2024. All rights reserved.