PDA

Просмотр полной версии : Добавить интерфейс



AlexDav
18.10.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
18.10.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
19.10.2005, 10:31
Ура! Спасибо! Просто воспользовался устаревшим примером.
Из трех форумов - только один дельный ответ.
Еще раз спасибо - все работает! :D