Добавить интерфейс

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Eugie, Romeo, Hawk

Ответить
AlexDav
Сообщения: 34
Зарегистрирован: 18 окт 2005, 15:37

18 окт 2005, 17:04

Я делаю 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, в книжке написанно что достаточно добавить его в наследуемые и в карту — я это делаю:

в .h файле

Код: Выделить всё

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()



	DECLARE_PROTECT_FINAL_CONSTRUCT()

	HRESULT FinalConstruct()
	{
		return S_OK;
	}

	void FinalRelease()
	{
	}

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 CMyIePlag::QueryStatus( GUID *pguidCmdGroup, 
      ULONG cCmds,
      OLECMD *prgCmds,
	  OLECMDTEXT *pCmdText)
{
return S_OK;
}



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

В результате ошибка:

Код: Выделить всё

Error	1	error C2259: 'ATL::CComObject<Base>' : cannot instantiate abstract class	c:\program files\microsoft visual studio 8\vc\atlmfc\include\atlcom.h	1787
В чем дело?
Eugie
Сообщения: 707
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

18 окт 2005, 22:54

Ты забыл const в объявлении 1 параметра методов IOleCommandTarget.
Прототипы такие:

Код: Выделить всё

HRESULT Exec(
  const GUID *pguidCmdGroup,  // Pointer to command group
  DWORD nCmdID,               // Identifier of command to execute
  DWORD nCmdExecOpt,          // Options for executing the command
  VARIANTARG *pvaIn,          // Pointer to input arguments
  VARIANTARG *pvaOut          // Pointer to command output
);

[input_sync] HRESULT QueryStatus(
  const GUID *pguidCmdGroup, // Pointer to command group
  ULONG cCmds,          // Number of commands in prgCmds array
  OLECMD *prgCmds,      // Array of commands
  OLECMDTEXT *pCmdText  // Pointer to name or status of command
);
AlexDav
Сообщения: 34
Зарегистрирован: 18 окт 2005, 15:37

19 окт 2005, 10:31

Ура! Спасибо! Просто воспользовался устаревшим примером.
Из трех форумов - только один дельный ответ.
Еще раз спасибо - все работает! :D
Ответить