, . , , , , . (Item Moniker) IOleItemContainer .
, :
clsid:571F1680-CC83-11d0-8C48-0080C73925BA:!Ursus
"!" Class Moniker (item name) "Ursus". MkParseDisplayName "clsid" ProgID lass Moniker. MkParseDisplayName Class Moniker , . , , lass Moniker GUID , :
!Ursus
, , MkParseDisplayName ( ) , ( Gorilla) . IParseDisplayName:
[ 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 ); }
, , Gorilla IParseDisplayName "!Ursus" , MkParseDisplayName . , :
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; }
, . "!", .
, MkParseDisplayName , (generic composite moniker). . BindToObject , pmkToLeft. :
// pseudo-code from OLE32.0LL // OLE32.DLL STDMETHODIMP GenericComposite::BindToObject (IBindCtx *pbc, IMoniker *pmkToLeft, REFIID riid, void **ppv) { return m_pmkRight->BindToObject(pbc, m_pmkLeft, riid, ppv); }
, , . , , pmkToLeft .
, IOleItemContainer . indToObject:
// pseudo-code from OLE32.DLL // OLE32.DLL STDMETHODIMP ItemMoniker::BindToObject( IBindCtx *pbc, IMoniker *pmkToLeft, REFIID riid, void **ppv) { // assume failure // *ppv = 0; if (pmkToLeft == 0) //requires a scope - return E_INVALIDARG; // first bind moniker to left // IOleItemContainer *poic = 0; HRESULT hr = pmkToLeft->BindToObject(pbc, 0, IID_IOleItemContainer, (void**)&poic); if (SUCCEEDED(hr)) { // cache the bound object in binding context // pbc->RegisterObjectBound(poic); // get bind speed from Bind Context // DWORD dwBindSpeed = this->MyGetSpeedFromCtx(pbc); // ask object for named sub-object // hr = poic->GetObject(m_pszItem, dwBindSpeed, pbc, riid, ppv); poic->Release(); } }
, :
HRESULT GetUrsus(IApe *&rpApe) { const OLECHAR pwsz[] = OLESTR("clsid:571F1680-CC83-11d0-8C48-0080C73925BA:!Ursus"); return CoGetObject(pwsz, 0, IID_IApe, (void**)&rpApe); }
:
HRESULT GetUrsus(IApe *&rpApe) { IOleItemContainer *poic = 0; HRESULT hr = CoGetClassObject(CLSID_Gorilla, CLSCTX_ALL, 0, IID_IOleItemContainer, (void**)&poic); if (SUCCEEDED(hr)) { hr = poic->GetObject(OLESTR("Ursus"), BINDSPEED_INFINITE, 0, IID_IApe, (void**)&rpApe); poic->Release(); } return hr; }
, (indirection), CoGetObject, .