Re[2]: Проблема с IConnectionPointContainer
От: Аноним  
Дата: 14.04.05 10:44
Оценка:
Здравствуйте, LioLick, Вы писали:

LL>Здравствуйте, Tester1, Вы писали:




T>>Помогите разобраться.

LL>определение класса сервера покажите

EXE сервер создал визардом ATL с атрибутами в VC 7.0. Все параметры по умолчанию, только добавил галочку на Connection Points. Вот собственно его код:

...
[
dispinterface,
uuid("857E6222-BC96-4899-A8D1-FD89AE9458A3"),
helpstring("_IAtlClassEvents Interface")
]
__interface _IAtlClassEvents
{
[id(1), helpstring("method method2")] HRESULT method2(void);
};


// CAtlClass

[
coclass,
threading("apartment"),
event_source("com"),
vi_progid("atl_server.AtlClass"),
progid("atl_server.AtlClass.1"),
version(1.0),
uuid("3498861D-FA53-4298-958D-6063F6A9A803"),
helpstring("AtlClass Class")
]
class ATL_NO_VTABLE CAtlClass :
public IAtlClass
{
public:
CAtlClass()
{
}

__event __interface _IAtlClassEvents;

DECLARE_PROTECT_FINAL_CONSTRUCT()

HRESULT FinalConstruct()
{
return S_OK;
}

void FinalRelease()
{
}

public:

...
};


Как я понимаю определения event_source("com") и __event __interface должны обеспечивать
потдержку интерфейса IConnectionPointContainer.

Нагляднее неатрибутированный вариант:

class ATL_NO_VTABLE CAtlClass :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CAtlClass, &CLSID_AtlClass>,
public IConnectionPointContainerImpl<CAtlClass>,
public CProxy_IAtlClassEvents<CAtlClass>,
public IDispatchImpl<IAtlClass, &IID_IAtlClass, &LIBID_AtlserverLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
{
public:
CAtlClass()
{
}

DECLARE_REGISTRY_RESOURCEID(IDR_ATLCLASS)


BEGIN_COM_MAP(CAtlClass)
COM_INTERFACE_ENTRY(IAtlClass)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(IConnectionPointContainer)
END_COM_MAP()

BEGIN_CONNECTION_POINT_MAP(CAtlClass)
CONNECTION_POINT_ENTRY(__uuidof(_IAtlClassEvents))
END_CONNECTION_POINT_MAP()

...

В COM_MAP итрерфейс есть! IAtlClass и IDispatch получаю, а вот на IConnectionPointContainer ошибка.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.