Re[5]: Добавление интерфейса
От: algol Россия about:blank
Дата: 18.10.05 14:28
Оценка: 3 (1)
Здравствуйте, Аноним, Вы писали:

А>Это исправил, но опять вернулась

А>
А>Error    1    error C2259: 'ATL::CComObject<Base>' : cannot instantiate abstract class    c:\program files\microsoft visual studio 8\vc\atlmfc\include\atlcom.h    1787
А>

А>Может какой файл надо присоединить?

Ничего не нужно присоединять. Скорее всего не совпадают параметры в методе класса и описании интерфейса. Там точно стоит "const GUID*".
Добавление интерфейса
От: Аноним  
Дата: 18.10.05 11:34
Оценка:
Я делаю ATL проек (не атрибутированный), добавляе Simple Object:
class ATL_NO_VTABLE CMyIePlag :
public CComObjectRootEx<CComMultiThreadModel>,
public CComCoClass<CMyIePlag, &CLSID_MyIePlag>,
public IObjectWithSiteImpl<CMyIePlag>,
public IDispatchImpl<IMyIePlag, &IID_IMyIePlag, &LIBID_IEELib, /*wMajor =*/ 1, /*wMinor =*/ 0>,

{
public:
CMyIePlag()
{
}

DECLARE_REGISTRY_RESOURCEID(IDR_MYIEPLAG)


BEGIN_COM_MAP(CMyIePlag)
COM_INTERFACE_ENTRY(IMyIePlag)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(IObjectWithSite)
END_COM_MAP()




Мне надо добавить интерфейс IOleCommandTarget, в книжке написанно что достаточно добавить его в наследуемые и в карту — я это делаю:

class ATL_NO_VTABLE CMyIePlag :
public CComObjectRootEx<CComMultiThreadModel>,
public CComCoClass<CMyIePlag, &CLSID_MyIePlag>,
public IObjectWithSiteImpl<CMyIePlag>,
public IDispatchImpl<IMyIePlag, &IID_IMyIePlag, &LIBID_IEELib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
public IOleCommandTarget
{
public:
CMyIePlag()
{
}

DECLARE_REGISTRY_RESOURCEID(IDR_MYIEPLAG)


BEGIN_COM_MAP(CMyIePlag)
COM_INTERFACE_ENTRY(IMyIePlag)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(IObjectWithSite)
COM_INTERFACE_ENTRY(IOleCommandTarget)
END_COM_MAP()



Но после этого сразу выдается ошибка Error 1 error C2259: 'ATL::CComObject<Base>' : cannot instantiate abstract class c:\program files\microsoft visual studio 8\vc\atlmfc\include\atlcom.h 1787





И еще сразу вопрос (тупить так до конца) — если я хочу переопределить метод к примеру Release() — как его нужно объявить?
Re: Добавление интерфейса
От: algol Россия about:blank
Дата: 18.10.05 11:53
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Я делаю ATL проек (не атрибутированный), добавляе Simple Object:

А>Мне надо добавить интерфейс IOleCommandTarget, в книжке написанно что достаточно добавить его в наследуемые и в карту — я это делаю:
А>Но после этого сразу выдается ошибка Error 1 error C2259: 'ATL::CComObject<Base>' : cannot instantiate abstract class c:\program files\microsoft visual studio 8\vc\atlmfc\include\atlcom.h 1787

Раз вы объявили, что ваш объект релизует интерфейс IOleCommandTarget, то нужно добавить и реализацию методов этого интерфейса, а именно QueryStatus() и Exec().

А>И еще сразу вопрос (тупить так до конца) — если я хочу переопределить метод к примеру Release() — как его нужно объявить?


Что значит переопределить, и чей это метод Release (не IUnknown)?
Re[2]: Добавление интерфейса
От: Аноним  
Дата: 18.10.05 11:59
Оценка:
Здравствуйте, algol, Вы писали:

A>Здравствуйте, Аноним, Вы писали:


A>Раз вы объявили, что ваш объект релизует интерфейс IOleCommandTarget, то нужно добавить и реализацию методов этого интерфейса, а именно QueryStatus() и Exec().


Посмотрев MSDN по этой ошибки я так и решил — вот что наваял:
в .h файле

public:
    STDMETHOD (QueryStatus)(
      GUID *pguidCmdGroup, 
      ULONG cCmds,
      OLECMD *prgCmds,
      OLECMDTEXT *pCmdText);
   STDMETHOD (Exec)(
      GUID *pguidCmdGroup,
      DWORD nCmdID,
      DWORD nCmdExecOpt,
      VARIANTARG *pvaIn,
      VARIANTARG *pvaOut);



и в .cpp

STDMETHODIMP IMyIePlag::QueryInterface(REFIID iid, void **ppvObject)
{
return S_OK;
}



STDMETHODIMP IMyIePlag::Exec(const GUID *pguidCmdGroup, DWORD nCmdID,
      DWORD nCmdExecOpt,
      VARIANTARG *pvaIn,
      VARIANTARG *pvaOut)
{
return S_OK;
}


Теперь он выдает:

Error    1    error C2509: 'QueryInterface' : member function not declared in 'IMyIePlag'    u:\мои документы\visual studio 2005\projects\iee\iee\myieplag.cpp    10
Error    2    error C2039: 'Exec' : is not a member of 'IMyIePlag'    u:\мои документы\visual studio 2005\projects\iee\iee\myieplag.cpp    16




A>Что значит переопределить, и чей это метод Release (не IUnknown)?


Именно его я имел ввиду, но как бы в общем — если ответите на первый вопрос, как я понимаю, решиться и этот.
Заранее спасибо.
Re[3]: Добавление интерфейса
От: algol Россия about:blank
Дата: 18.10.05 12:16
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Теперь он выдает:

А>
А>Error    1    error C2509: 'QueryInterface' : member function not declared in 'IMyIePlag'    u:\мои документы\visual studio 2005\projects\iee\iee\myieplag.cpp    10
А>Error    2    error C2039: 'Exec' : is not a member of 'IMyIePlag'    u:\мои документы\visual studio 2005\projects\iee\iee\myieplag.cpp    16
А>


1. При чем здесь QueryInterface? Нужно определить QueryStatus.
2. Наверное ошибка из-за несовпадения параметров метода — в h. GUID*, а в .cpp const GUID*.
Re[4]: Добавление интерфейса
От: Аноним  
Дата: 18.10.05 12:41
Оценка:
Здравствуйте, algol, Вы писали:

A>1. При чем здесь QueryInterface? Нужно определить QueryStatus.

A>2. Наверное ошибка из-за несовпадения параметров метода — в h. GUID*, а в .cpp const GUID*.

Да, я — баран
Это исправил, но опять вернулась


Error    1    error C2259: 'ATL::CComObject<Base>' : cannot instantiate abstract class    c:\program files\microsoft visual studio 8\vc\atlmfc\include\atlcom.h    1787



Может какой файл надо присоединить?
Re[6]: Добавление интерфейса
От: AlexDav Россия  
Дата: 19.10.05 06:34
Оценка:
Здравствуйте, algol, Вы писали:


A>Ничего не нужно присоединять. Скорее всего не совпадают параметры в методе класса и описании интерфейса. Там точно стоит "const GUID*".


Ага, спасибо — все точно — с параметрами облажался.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.