Маршаллинг интерфейса.
От: -comm- http://forum.sukhoi.ru/forumdisplay.php?f=120
Дата: 06.05.05 06:59
Оценка:
Здравствуйте.

Проблема в следующем.

COM сервер реализован, как out-of-prosecc сервер (в EXE). В нем объявлен интерфейс:

// IServerList Interface

[
object,
uuid(297481F0-A3D2-43d1-B0DB-9A6C4B007885),
helpstring("IServerList Interface"),
pointer_default(unique)
]
interface IServerList : IUnknown{
[helpstring("method RegisterServer")] HRESULT RegisterServer([in] BSTR ConnStr, [out] LPDBOBJECTID ObjID, [out] IServer ** Server);
[helpstring("method UnregisterServer")] HRESULT UnregisterServer([in] LPDBOBJECTID ObjID);
[helpstring("method EnumServer")] HRESULT EnumServer([out] IEnumServer ** Enum);
};

При попытке вызова метода EnumServer получаю результат "интерфейс не реализован".

Сам интерфейс IEnumServer определен так:

// IEnumServer Interface

[
object,
uuid(D1019908-2CB3-4e71-9649-942750D0ED47),
helpstring("IEnumServer Interface"),
pointer_default(unique)
]
interface IEnumServer : IUnknown{
[helpstring("method Next")] HRESULT Next([in] ULONG celt, [out, size_is(celt), length_is(*pceltFetched)] IServer ** rgelt , [out] ULONG * pceltFetched);
[helpstring("method Skip")] HRESULT Skip([in] ULONG celt);
[helpstring("method Reset")] HRESULT Reset(void);
[helpstring("method Clone")] HRESULT Clone([out] IEnumServer ** ppenum);
};

Класс для интерфейса IEnumServer реализован с помощью шаблонов вот так:

// Declaration of the CEnumServer
typedef _CopyInterface<IServer> CServerCopy;
typedef CComEnum<IEnumServer, &CLSID_EnumServer, IServer *, CServerCopy> CEnumServer;//Class;

Возвращается энумератор так:

STDMETHODIMP CServerList::EnumServer(IEnumServer ** Enum)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());

HRESULT hr;
CComPtr<IServer> iServer;
CCommonClass<CServer> * cServer = NULL;

// Get pointer to IServer interface
hr = GetInterfaceFromClass<CCommonClass<CServer> , IServer>(&iServer, &cServer);
if (FAILED(hr))
return hr;

IServer * serverIntf = (IServer *)iServer;

// Put pointer to IServer interface to enumerator
hr = CreateEnumerator<CEnumServer, IServer *>(
(IUnknown**)Enum,
&serverIntf,
(&serverIntf + 1),
NULL,
AtlFlagCopy);

return hr;
}

Сервер корректно возвращает энумератор, но до клиента он (энумератор) не доходит.

Ну и еще дополнительная информация... При трассировке сервера, у него запрашиваются интерфейсы IMarshal и IStdMarshalInfo, на которые COM благополучно получает ответ "no implement". При этом proxy/stub зарегестрирована. Впрочем, сам интерфейс IServerList возвращается клиенту благополучно, и его первые два метода работают.

Подскажите пожалуйста, в каком направлении искать ошибку? Что я не так сделал?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.