Проблема с IConnectionPointContainer
От: Tester1  
Дата: 13.04.05 16:29
Оценка:
Есть EXE серевер, потдерживающий ConnectionPoints.

В приложении клиента пытаюсь вызывать

pISomeObject->QueryInterface(IID_IConnectionPointContainer,(void**)&pIConnectionPointContainer);

получаю ошибку: The requested section was not present in the activation context.


Клиент выглядит так:

CoInitialize(NULL);
IAtlClass *pISomeObject;
CoCreateInstance(
CLSID_CAtlClass,
NULL,
CLSCTX_LOCAL_SERVER,
IID_IAtlClass,
(void**) &pISomeObject);

IConnectionPointContainer *pIConnectionPointContainer = NULL;
pISomeObject->QueryInterface(IID_IConnectionPointContainer,(void **)&pIConnectionPointContainer);

...

Сервер создан через ATL с параметрами по умолчанию, добавлена только потдержка ConnectionPoints.


Помогите разобраться.
Re: Проблема с IConnectionPointContainer
От: LioLick  
Дата: 14.04.05 05:44
Оценка:
Здравствуйте, Tester1, Вы писали:

2LioLick — полегче с цитированием

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

определение класса сервера покажите
GL!
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...
Пока на собственное сообщение не было ответов, его можно удалить.