// 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 возвращается клиенту благополучно, и его первые два метода работают.
Подскажите пожалуйста, в каком направлении искать ошибку? Что я не так сделал?
ВС>Вот я так и не въехал в разницу... Можете популярно объяснить, если, конечно, время позволяет?
GUID или UUID — глобальный (или универсальный) идентификационный номер.
CLSID_EnumServer — GUID кокласса — уникально идентифицирует класс компонента, чтобы его можно было создать через CoCreateInstance и пр.
IID_EnumServer — GUID интерфейса — уникально идентифицирует интерфейс, чтобы его можно было запрашивать у объекта через QueryInterface и пр.
Как правило, GUIDы идентифицируют отдельные сущности и не пересекаются, хотя есть и исключения, которые проистекают из автоматизации. Например, кокласс прокси автоматически имеют CLSID, равный IID первого интерфейса из набора интерфейсов, поддерживаемых этой прокси. И т.д.
Поэтому для шаблона CComEnum<IEnumServer, &CLSID_EnumServer,...>:
— запрашивать интерфейс с IID_EnumServer бесполезно, потому что он откликнется только на "интерфейс", имеющий GUID, равный CLSID_EnumServer,
— а запрашивать интерфейс с CLSID_EnumServer ни у кого и мысли не возникнет, потому что его не существует в природе.