// use the class object to create a gorilla
// используем объект класса для создания gorilla
hr = pcf->CreateInstance(0, IID_IApe, (void**)&pApe);
if (SUCCEEDED(hr)) {
// tell the new gorilla to eat a banana
// говорим новой горилле съесть банан
hr = pApe->EatBanana();
pApe->Release();
}
pcf->Release();
}
return hr;
}

Рисунок 3.5 иллюстрирует, какие объекты создаются или находятся посредством каждой операции.
Visual Basic предоставляет функциональные возможности API-функции
Sub CreateGorillaAndEatBanana()
Dim gc as IApeClass
Dim ape as IApe
Dim sz as String sz = «clsid:571F1680-CC83-11d0-8C48-0080C73925BA:»
' get the class object for gorillas
' получаем объект класса для gorilla
Set gc = GetObject(sz)
' ask Gorilla class object to create a new gorilla
' запрашиваем объект класса Gorilla создать новую gorilla
Set ape = gc.CreateApe()
' ask gorilla to eat a banana
' просим gorilla есть бананы
ape.EatBanana
End Sub
Отметим, что версия этой функции на Visual Basic использует интерфейс
Моникеры и композиция
Моникеры часто составляются из других моникеров, чтобы с помощью текстового описания пути можно было осуществлять навигацию по иерархиям объектов. Чтобы обеспечить простую поддержку этого типа управления, в СОМ предусмотрена стандартная реализация моникеров, которая, будучи поставленной справа от другого моникера, запрашивает объект связать ссылку с другим объектом в иерархии. Такой моникер называется моникером элемента (
Следующее отображаемое имя показывает, как моникер элемента использован в тандеме с классовым моникером:
clsid:571F1680-CC83-11d0-8C48-0080C73925BA:!Ursus
Отметим использование символа '
Поскольку это имя имеет смысл только в области действия объекта, именованного моникером слева от него, фактически
[ object,uuid(0000011a-0000-0000-C000-000000000046) ]
interface IParseDisplayName : IUnknown
{
// convert display name to a moniker
// преобразуем отображаемое имя в моникер
HRESULT ParseDisplayName( [in, unique] IBindCtx *pbc, [in] LPOLESTR pszDisplayName, [out] ULONG *pchEaten, [out] IMoniker **ppmkOut );
}
В случае отображаемого имени, использованного в этом примере, объекту класса
STDMETHODIMP GorillaClass::ParseDisplayName(IBindCtx *pbc, LPOLESTR pszDisplayName, ULONG *pchEaten, IMoniker **ppmkOut)
{
// create an item moniker using explicit API function
// создаем отдельный моникер, используя явную API-функцию
HRESULT hr = CreateItemMoniker(OLESTR('!'), pszDisplayName + 1, ppmkOut);
// indicate how many characters were parsed
// показываем, сколько символов было проанализировано
if (SUCCEEDED(hr)) *pchEaten = wcslen(pszDisplayName);
else *pchEaten = 0; return hr;