Есть 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.
Помогите разобраться.
Здравствуйте, Tester1, Вы писали:
2LioLick — полегче с цитированием
T>Помогите разобраться.
определение класса сервера покажите
Здравствуйте, 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 ошибка.