Ошибка c2259, реализующая класс интерфейса из IUnknown - PullRequest
0 голосов
/ 22 июля 2011

Я пытаюсь добавить проект c ++ в мой код на c # и пытаюсь реализовать интерфейс IUnknown. Я получаю сообщение об ошибке c2259: не могу создать экземпляр абстрактного класса.

Я пытался поиграть с некоторыми вещами, такими как превращение класса в класс ref и изменение реализации, но, похоже, ничего не работает. Ниже приведен код, который я использую.

Мой класс интерфейса:

interface __declspec(uuid("c78b266d-b2c0-4e9d-863b-e3f74a721d47"))
IClientWrapper : public IUnknown
{
    public:
        virtual STDMETHODIMP get_CurrentIsReadOnly(bool *pIsReadOnly) = 0;
        virtual STDMETHODIMP get_CachedIsReadOnly(bool *pIsReadOnly) = 0;
};

Мой класс обработчиков:

#include "RotateHandler.h"

RotateHandler::RotateHandler()
{
}

RotateHandler::~RotateHandler()
{
}

STDMETHODIMP RotateHandler::CreateClientWrapper(IUIAutomationPatternInstance *pPatternInstance, IUnknown **pClientWrapper)
{
    *pClientWrapper = new RotateWrapper(pPatternInstance);  //here is error c2259
    if (*pClientWrapper == NULL)
        return E_INVALIDARG;
    return S_OK;
}

STDMETHODIMP RotateHandler::Dispatch(IUnknown *pTarget, UINT index, const struct UIAutomationParameter *pParams, UINT cParams)
{
    switch(index)
    {
        case Rotation_GetIsReadOnly:
            return ((ICustomProvider*)pTarget)->get_IsReadOnly((bool*)pParams[0].pData);
    }
    return E_INVALIDARG;
}

И мой класс-обёртка:

#include "RotateWrapper.h"

RotateWrapper::RotateWrapper()
{
}

RotateWrapper::RotateWrapper(IUIAutomationPatternInstance *pInstance)
    : _pInstance(pInstance)
{
    _pInstance->AddRef();
}

RotateWrapper::~RotateWrapper()
{
    _pInstance->Release();
}

STDMETHODIMP RotateWrapper::get_CurrentIsReadOnly(bool *pIsReadOnly)
{
    return _pInstance->GetProperty(0, false, UIAutomationType_Bool, pIsReadOnly);
}

STDMETHODIMP RotateWrapper::get_CachedIsReadOnly(bool *pIsReadOnly)
{
    return _pInstance->GetProperty(0, true, UIAutomationType_Bool, pIsReadOnly);
}

Любая помощь приветствуется.

Мое определение класса выглядит так:

public class RotateWrapper : public IClientWrapper

1 Ответ

2 голосов
/ 22 июля 2011

Вам необходимо реализовать методы, унаследованные от IUnknown: QueryInterface, AddRef и Release.Невыполнение этого требования означает, что в вашем классе все еще есть чисто виртуальные методы, и компилятор правильно запретил вам создавать экземпляры такого класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...