Студии нет под рукой, но я раньше много работал с COM, могу рассказать на пальцах.
Во-первых, все COM интерфейсы порождены от IUnknown, который накладывает на COM объекты поведение автопоинтеров. Так что не забывай вызывать Release после того, как объект тебе уже стал не нужен.
Во-вторых, что дальше делать с get__NewEnum. Благодаря всё тому же IUnknown, все COM объекты умеют приводиться или не приводиться к указанному интерфейсу с помощью стандартного метода QueryInterface. Этот факт мы должны использовать следующим образом. Открываем
help на интересующий метод get__NewEnum. Вот, что там написано о методе:
The IADsContainer::get__NewEnum method Retrieves an enumerator object for the container. The enumerator object implements the IEnumVARIANT interface to enumerate the children of the container object.
По поводу единственного параметра метода там говориться следующее:
ppEnumerator [ out ]
Pointer to an IUnknown pointer that receives the enumerator object. The caller must release this interface when it is no longer required.
Это значит, что мы можем написать следующий код:
Код: Выделить всё
IUnknown* pEnumUnkn = NULL;
pContainer->get__NewEnum(pEnumUnkn);
if (pEnumUnkn != NULL)
{
IEnumVARIANT* pEnum = NULL;
HRESULT hr = pEnumUnkn->QueryInterface(IID_IEnumVARIANT, &pEnum);
if (hr == S_OK)
{
// work with enum
pEnum->Release();
}
pEnumUnkn->Release();
}
Альтернатиный вариант - использовать хелпер функцию ADsBuildEnumerator, о которой написано в той же статье. В этом случае мы сразу получим указатель на IEnumVARIANT. Но нам нужно будет на забыть вызвать в конце ADSFreeEnumerator.
А вообще, очень печально работать с COM без всяких библиотек. Как видишь, получается очень много не несущего логической нагрузки кода. Рекомендую подключить к проекту ATL и использовать оттуда классы CComPtr (легковесная автопоинтер-обёртка с автоматическими вызовами AddRef/Release), CComQIPtr (то же самое, но в операторе присваивания автоматически делает QueryInterface), CComBSTR (для работы с BSTR строками) и прочие удобства библиотеки.