Essential COM

, . , , , , . (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, .



Suschnost' tehnologii SOM
Essential COM
ISBN: 0201634465
EAN: 2147483647
Year: N/A
Pages: 103
Authors: Don Box

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net