ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

pointermoniker.c
Go to the documentation of this file.
00001 /*
00002  * Pointer Moniker Implementation
00003  *
00004  * Copyright 1999 Noomen Hamza
00005  * Copyright 2008 Robert Shearman (for CodeWeavers)
00006  *
00007  * This library is free software; you can redistribute it and/or
00008  * modify it under the terms of the GNU Lesser General Public
00009  * License as published by the Free Software Foundation; either
00010  * version 2.1 of the License, or (at your option) any later version.
00011  *
00012  * This library is distributed in the hope that it will be useful,
00013  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00014  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00015  * Lesser General Public License for more details.
00016  *
00017  * You should have received a copy of the GNU Lesser General Public
00018  * License along with this library; if not, write to the Free Software
00019  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
00020  */
00021 
00022 #include <stdarg.h>
00023 #include <string.h>
00024 
00025 #define COBJMACROS
00026 #define NONAMELESSUNION
00027 #define NONAMELESSSTRUCT
00028 
00029 #include "windef.h"
00030 #include "winbase.h"
00031 #include "winerror.h"
00032 #include "winuser.h"
00033 #include "objbase.h"
00034 #include "oleidl.h"
00035 #include "wine/debug.h"
00036 #include "moniker.h"
00037 
00038 WINE_DEFAULT_DEBUG_CHANNEL(ole);
00039 
00040 /* PointerMoniker data structure */
00041 typedef struct PointerMonikerImpl{
00042 
00043     IMoniker IMoniker_iface;
00044 
00045     LONG ref; /* reference counter for this object */
00046 
00047     IUnknown *pObject; /* custom marshaler */
00048 } PointerMonikerImpl;
00049 
00050 static inline PointerMonikerImpl *impl_from_IMoniker(IMoniker *iface)
00051 {
00052 return CONTAINING_RECORD(iface, PointerMonikerImpl, IMoniker_iface);
00053 }
00054 
00055 static HRESULT WINAPI
00056 PointerMonikerImpl_QueryInterface(IMoniker* iface,REFIID riid,void** ppvObject)
00057 {
00058     PointerMonikerImpl *This = impl_from_IMoniker(iface);
00059 
00060     TRACE("(%p,%p,%p)\n",This,riid,ppvObject);
00061 
00062     /* Perform a sanity check on the parameters.*/
00063     if ( (This==0) || (ppvObject==0) )
00064     return E_INVALIDARG;
00065 
00066     /* Initialize the return parameter */
00067     *ppvObject = 0;
00068 
00069     /* Compare the riid with the interface IDs implemented by this object.*/
00070     if (IsEqualIID(&IID_IUnknown, riid) ||
00071         IsEqualIID(&IID_IPersist, riid) ||
00072         IsEqualIID(&IID_IPersistStream, riid) ||
00073         IsEqualIID(&IID_IMoniker, riid))
00074         *ppvObject = iface;
00075 
00076     /* Check that we obtained an interface.*/
00077     if ((*ppvObject)==0)
00078         return E_NOINTERFACE;
00079 
00080     /* always increase the reference count by one when it is successful */
00081     IMoniker_AddRef(iface);
00082 
00083     return S_OK;
00084 }
00085 
00086 /******************************************************************************
00087  *        PointerMoniker_AddRef
00088  ******************************************************************************/
00089 static ULONG WINAPI
00090 PointerMonikerImpl_AddRef(IMoniker* iface)
00091 {
00092     PointerMonikerImpl *This = impl_from_IMoniker(iface);
00093 
00094     TRACE("(%p)\n",This);
00095 
00096     return InterlockedIncrement(&This->ref);
00097 }
00098 
00099 /******************************************************************************
00100  *        PointerMoniker_Release
00101  ******************************************************************************/
00102 static ULONG WINAPI
00103 PointerMonikerImpl_Release(IMoniker* iface)
00104 {
00105     PointerMonikerImpl *This = impl_from_IMoniker(iface);
00106     ULONG ref;
00107 
00108     TRACE("(%p)\n",This);
00109 
00110     ref = InterlockedDecrement(&This->ref);
00111 
00112     /* destroy the object if there's no more reference on it */
00113     if (ref == 0)
00114     {
00115         if (This->pObject) IUnknown_Release(This->pObject);
00116         HeapFree(GetProcessHeap(),0,This);
00117     }
00118 
00119     return ref;
00120 }
00121 
00122 /******************************************************************************
00123  *        PointerMoniker_GetClassID
00124  ******************************************************************************/
00125 static HRESULT WINAPI
00126 PointerMonikerImpl_GetClassID(IMoniker* iface,CLSID *pClassID)
00127 {
00128     TRACE("(%p,%p)\n",iface,pClassID);
00129 
00130     if (pClassID==NULL)
00131         return E_POINTER;
00132 
00133     *pClassID = CLSID_PointerMoniker;
00134 
00135     return S_OK;
00136 }
00137 
00138 /******************************************************************************
00139  *        PointerMoniker_IsDirty
00140  ******************************************************************************/
00141 static HRESULT WINAPI
00142 PointerMonikerImpl_IsDirty(IMoniker* iface)
00143 {
00144     /* Note that the OLE-provided implementations of the IPersistStream::IsDirty
00145        method in the OLE-provided moniker interfaces always return S_FALSE because
00146        their internal state never changes. */
00147 
00148     TRACE("(%p)\n",iface);
00149 
00150     return S_FALSE;
00151 }
00152 
00153 /******************************************************************************
00154  *        PointerMoniker_Load
00155  ******************************************************************************/
00156 static HRESULT WINAPI
00157 PointerMonikerImpl_Load(IMoniker* iface,IStream* pStm)
00158 {
00159     TRACE("(%p)\n", pStm);
00160 
00161     return E_NOTIMPL;
00162 }
00163 
00164 /******************************************************************************
00165  *        PointerMoniker_Save
00166  ******************************************************************************/
00167 static HRESULT WINAPI
00168 PointerMonikerImpl_Save(IMoniker* iface, IStream* pStm, BOOL fClearDirty)
00169 {
00170     TRACE("(%p, %d)\n", pStm, fClearDirty);
00171 
00172     return E_NOTIMPL;
00173 }
00174 
00175 /******************************************************************************
00176  *        PointerMoniker_GetSizeMax
00177  *
00178  * PARAMS
00179  * pcbSize [out] Pointer to size of stream needed to save object
00180  ******************************************************************************/
00181 static HRESULT WINAPI
00182 PointerMonikerImpl_GetSizeMax(IMoniker* iface, ULARGE_INTEGER* pcbSize)
00183 {
00184     TRACE("(%p,%p)\n",iface,pcbSize);
00185 
00186     if (!pcbSize)
00187         return E_POINTER;
00188 
00189     pcbSize->u.LowPart = 0;
00190     pcbSize->u.HighPart = 0;
00191 
00192     return E_NOTIMPL;
00193 }
00194 
00195 /******************************************************************************
00196  *                  PointerMoniker_BindToObject
00197  ******************************************************************************/
00198 static HRESULT WINAPI
00199 PointerMonikerImpl_BindToObject(IMoniker* iface, IBindCtx* pbc, IMoniker* pmkToLeft,
00200                              REFIID riid, VOID** ppvResult)
00201 {
00202     PointerMonikerImpl *This = impl_from_IMoniker(iface);
00203 
00204     TRACE("(%p,%p,%p,%p,%p)\n",iface,pbc,pmkToLeft,riid,ppvResult);
00205 
00206     if (!This->pObject)
00207         return E_UNEXPECTED;
00208 
00209     return IUnknown_QueryInterface(This->pObject, riid, ppvResult);
00210 }
00211 
00212 /******************************************************************************
00213  *        PointerMoniker_BindToStorage
00214  ******************************************************************************/
00215 static HRESULT WINAPI
00216 PointerMonikerImpl_BindToStorage(IMoniker* iface, IBindCtx* pbc, IMoniker* pmkToLeft,
00217                               REFIID riid, VOID** ppvResult)
00218 {
00219     PointerMonikerImpl *This = impl_from_IMoniker(iface);
00220 
00221     TRACE("(%p,%p,%p,%p,%p)\n",iface,pbc,pmkToLeft,riid,ppvResult);
00222 
00223     if (!This->pObject)
00224         return E_UNEXPECTED;
00225 
00226     return IUnknown_QueryInterface(This->pObject, riid, ppvResult);
00227 }
00228 
00229 /******************************************************************************
00230  *        PointerMoniker_Reduce
00231  ******************************************************************************/
00232 static HRESULT WINAPI
00233 PointerMonikerImpl_Reduce(IMoniker* iface, IBindCtx* pbc, DWORD dwReduceHowFar,
00234                        IMoniker** ppmkToLeft, IMoniker** ppmkReduced)
00235 {
00236     TRACE("(%p,%p,%d,%p,%p)\n",iface,pbc,dwReduceHowFar,ppmkToLeft,ppmkReduced);
00237 
00238     if (ppmkReduced==NULL)
00239         return E_POINTER;
00240 
00241     PointerMonikerImpl_AddRef(iface);
00242 
00243     *ppmkReduced=iface;
00244 
00245     return MK_S_REDUCED_TO_SELF;
00246 }
00247 /******************************************************************************
00248  *        PointerMoniker_ComposeWith
00249  ******************************************************************************/
00250 static HRESULT WINAPI
00251 PointerMonikerImpl_ComposeWith(IMoniker* iface, IMoniker* pmkRight,
00252                             BOOL fOnlyIfNotGeneric, IMoniker** ppmkComposite)
00253 {
00254 
00255     HRESULT res=S_OK;
00256     DWORD mkSys,mkSys2;
00257     IEnumMoniker* penumMk=0;
00258     IMoniker *pmostLeftMk=0;
00259     IMoniker* tempMkComposite=0;
00260 
00261     TRACE("(%p,%d,%p)\n", pmkRight, fOnlyIfNotGeneric, ppmkComposite);
00262 
00263     if ((ppmkComposite==NULL)||(pmkRight==NULL))
00264     return E_POINTER;
00265 
00266     *ppmkComposite=0;
00267 
00268     IMoniker_IsSystemMoniker(pmkRight,&mkSys);
00269 
00270     /* If pmkRight is an anti-moniker, the returned moniker is NULL */
00271     if(mkSys==MKSYS_ANTIMONIKER)
00272         return res;
00273 
00274     else
00275         /* if pmkRight is a composite whose leftmost component is an anti-moniker,           */
00276         /* the returned moniker is the composite after the leftmost anti-moniker is removed. */
00277 
00278          if(mkSys==MKSYS_GENERICCOMPOSITE){
00279 
00280             res=IMoniker_Enum(pmkRight,TRUE,&penumMk);
00281 
00282             if (FAILED(res))
00283                 return res;
00284 
00285             res=IEnumMoniker_Next(penumMk,1,&pmostLeftMk,NULL);
00286 
00287             IMoniker_IsSystemMoniker(pmostLeftMk,&mkSys2);
00288 
00289             if(mkSys2==MKSYS_ANTIMONIKER){
00290 
00291                 IMoniker_Release(pmostLeftMk);
00292 
00293                 tempMkComposite=iface;
00294                 IMoniker_AddRef(iface);
00295 
00296                 while(IEnumMoniker_Next(penumMk,1,&pmostLeftMk,NULL)==S_OK){
00297 
00298                     res=CreateGenericComposite(tempMkComposite,pmostLeftMk,ppmkComposite);
00299 
00300                     IMoniker_Release(tempMkComposite);
00301                     IMoniker_Release(pmostLeftMk);
00302 
00303                     tempMkComposite=*ppmkComposite;
00304                     IMoniker_AddRef(tempMkComposite);
00305                 }
00306                 return res;
00307             }
00308             else
00309                 return CreateGenericComposite(iface,pmkRight,ppmkComposite);
00310          }
00311          /* If pmkRight is not an anti-moniker, the method combines the two monikers into a generic
00312           composite if fOnlyIfNotGeneric is FALSE; if fOnlyIfNotGeneric is TRUE, the method returns
00313           a NULL moniker and a return value of MK_E_NEEDGENERIC */
00314           else
00315             if (!fOnlyIfNotGeneric)
00316                 return CreateGenericComposite(iface,pmkRight,ppmkComposite);
00317 
00318             else
00319                 return MK_E_NEEDGENERIC;
00320 }
00321 
00322 /******************************************************************************
00323  *        PointerMoniker_Enum
00324  ******************************************************************************/
00325 static HRESULT WINAPI
00326 PointerMonikerImpl_Enum(IMoniker* iface,BOOL fForward, IEnumMoniker** ppenumMoniker)
00327 {
00328     TRACE("(%p,%d,%p)\n",iface,fForward,ppenumMoniker);
00329 
00330     if (ppenumMoniker == NULL)
00331         return E_POINTER;
00332 
00333     *ppenumMoniker = NULL;
00334 
00335     return S_OK;
00336 }
00337 
00338 /******************************************************************************
00339  *        PointerMoniker_IsEqual
00340  ******************************************************************************/
00341 static HRESULT WINAPI
00342 PointerMonikerImpl_IsEqual(IMoniker* iface,IMoniker* pmkOtherMoniker)
00343 {
00344     PointerMonikerImpl *This = impl_from_IMoniker(iface);
00345     DWORD mkSys;
00346 
00347     TRACE("(%p,%p)\n",iface,pmkOtherMoniker);
00348 
00349     if (pmkOtherMoniker==NULL)
00350         return S_FALSE;
00351 
00352     IMoniker_IsSystemMoniker(pmkOtherMoniker,&mkSys);
00353 
00354     if (mkSys==MKSYS_POINTERMONIKER)
00355     {
00356         PointerMonikerImpl *pOtherMoniker = impl_from_IMoniker(pmkOtherMoniker);
00357         return This->pObject == pOtherMoniker->pObject ? S_OK : S_FALSE;
00358     }
00359     else
00360         return S_FALSE;
00361 }
00362 
00363 /******************************************************************************
00364  *        PointerMoniker_Hash
00365  ******************************************************************************/
00366 static HRESULT WINAPI PointerMonikerImpl_Hash(IMoniker* iface,DWORD* pdwHash)
00367 {
00368     PointerMonikerImpl *This = impl_from_IMoniker(iface);
00369 
00370     if (pdwHash==NULL)
00371         return E_POINTER;
00372 
00373     *pdwHash = PtrToUlong(This->pObject);
00374 
00375     return S_OK;
00376 }
00377 
00378 /******************************************************************************
00379  *        PointerMoniker_IsRunning
00380  ******************************************************************************/
00381 static HRESULT WINAPI
00382 PointerMonikerImpl_IsRunning(IMoniker* iface, IBindCtx* pbc, IMoniker* pmkToLeft,
00383                           IMoniker* pmkNewlyRunning)
00384 {
00385     TRACE("(%p,%p,%p,%p)\n",iface,pbc,pmkToLeft,pmkNewlyRunning);
00386 
00387     return S_OK;
00388 }
00389 
00390 /******************************************************************************
00391  *        PointerMoniker_GetTimeOfLastChange
00392  ******************************************************************************/
00393 static HRESULT WINAPI PointerMonikerImpl_GetTimeOfLastChange(IMoniker* iface,
00394                                                    IBindCtx* pbc,
00395                                                    IMoniker* pmkToLeft,
00396                                                    FILETIME* pAntiTime)
00397 {
00398     TRACE("(%p,%p,%p,%p)\n",iface,pbc,pmkToLeft,pAntiTime);
00399     return E_NOTIMPL;
00400 }
00401 
00402 /******************************************************************************
00403  *        PointerMoniker_Inverse
00404  ******************************************************************************/
00405 static HRESULT WINAPI
00406 PointerMonikerImpl_Inverse(IMoniker* iface,IMoniker** ppmk)
00407 {
00408     TRACE("(%p,%p)\n",iface,ppmk);
00409 
00410     return CreateAntiMoniker(ppmk);
00411 }
00412 
00413 /******************************************************************************
00414  *        PointerMoniker_CommonPrefixWith
00415  ******************************************************************************/
00416 static HRESULT WINAPI
00417 PointerMonikerImpl_CommonPrefixWith(IMoniker* iface,IMoniker* pmkOther,IMoniker** ppmkPrefix)
00418 {
00419     TRACE("(%p, %p)\n", pmkOther, ppmkPrefix);
00420 
00421     *ppmkPrefix = NULL;
00422 
00423     if (PointerMonikerImpl_IsEqual(iface, pmkOther))
00424     {
00425         IMoniker_AddRef(iface);
00426 
00427         *ppmkPrefix=iface;
00428 
00429         return MK_S_US;
00430     }
00431     else
00432         return MK_E_NOPREFIX;
00433 }
00434 
00435 /******************************************************************************
00436  *        PointerMoniker_RelativePathTo
00437  ******************************************************************************/
00438 static HRESULT WINAPI
00439 PointerMonikerImpl_RelativePathTo(IMoniker* iface,IMoniker* pmOther, IMoniker** ppmkRelPath)
00440 {
00441     TRACE("(%p,%p,%p)\n",iface,pmOther,ppmkRelPath);
00442 
00443     if (ppmkRelPath==NULL)
00444         return E_POINTER;
00445 
00446     *ppmkRelPath = NULL;
00447 
00448     return E_NOTIMPL;
00449 }
00450 
00451 /******************************************************************************
00452  *        PointerMoniker_GetDisplayName
00453  ******************************************************************************/
00454 static HRESULT WINAPI
00455 PointerMonikerImpl_GetDisplayName(IMoniker* iface, IBindCtx* pbc,
00456                                IMoniker* pmkToLeft, LPOLESTR *ppszDisplayName)
00457 {
00458     TRACE("(%p,%p,%p,%p)\n",iface,pbc,pmkToLeft,ppszDisplayName);
00459 
00460     if (ppszDisplayName==NULL)
00461         return E_POINTER;
00462 
00463     *ppszDisplayName = NULL;
00464     return E_NOTIMPL;
00465 }
00466 
00467 /******************************************************************************
00468  *        PointerMoniker_ParseDisplayName
00469  ******************************************************************************/
00470 static HRESULT WINAPI
00471 PointerMonikerImpl_ParseDisplayName(IMoniker* iface, IBindCtx* pbc,
00472                                  IMoniker* pmkToLeft, LPOLESTR pszDisplayName,
00473                                  ULONG* pchEaten, IMoniker** ppmkOut)
00474 {
00475     PointerMonikerImpl *This = impl_from_IMoniker(iface);
00476     HRESULT hr;
00477     IParseDisplayName *pPDN;
00478 
00479     TRACE("(%p,%p,%p,%p,%p,%p)\n",iface,pbc,pmkToLeft,pszDisplayName,pchEaten,ppmkOut);
00480 
00481     if (pmkToLeft)
00482         return MK_E_SYNTAX;
00483 
00484     if (!This->pObject)
00485         return E_UNEXPECTED;
00486 
00487     hr = IUnknown_QueryInterface(This->pObject, &IID_IParseDisplayName, (void **)&pPDN);
00488     if (FAILED(hr))
00489         return hr;
00490 
00491     hr = IParseDisplayName_ParseDisplayName(pPDN, pbc, pszDisplayName, pchEaten, ppmkOut);
00492     IParseDisplayName_Release(pPDN);
00493 
00494     return hr;
00495 }
00496 
00497 /******************************************************************************
00498  *        PointerMoniker_IsSystemMoniker
00499  ******************************************************************************/
00500 static HRESULT WINAPI
00501 PointerMonikerImpl_IsSystemMoniker(IMoniker* iface,DWORD* pwdMksys)
00502 {
00503     TRACE("(%p,%p)\n",iface,pwdMksys);
00504 
00505     if (!pwdMksys)
00506         return E_POINTER;
00507 
00508     *pwdMksys = MKSYS_POINTERMONIKER;
00509 
00510     return S_OK;
00511 }
00512 
00513 /********************************************************************************/
00514 /* Virtual function table for the PointerMonikerImpl class which  include IPersist,*/
00515 /* IPersistStream and IMoniker functions.                                       */
00516 static const IMonikerVtbl VT_PointerMonikerImpl =
00517 {
00518     PointerMonikerImpl_QueryInterface,
00519     PointerMonikerImpl_AddRef,
00520     PointerMonikerImpl_Release,
00521     PointerMonikerImpl_GetClassID,
00522     PointerMonikerImpl_IsDirty,
00523     PointerMonikerImpl_Load,
00524     PointerMonikerImpl_Save,
00525     PointerMonikerImpl_GetSizeMax,
00526     PointerMonikerImpl_BindToObject,
00527     PointerMonikerImpl_BindToStorage,
00528     PointerMonikerImpl_Reduce,
00529     PointerMonikerImpl_ComposeWith,
00530     PointerMonikerImpl_Enum,
00531     PointerMonikerImpl_IsEqual,
00532     PointerMonikerImpl_Hash,
00533     PointerMonikerImpl_IsRunning,
00534     PointerMonikerImpl_GetTimeOfLastChange,
00535     PointerMonikerImpl_Inverse,
00536     PointerMonikerImpl_CommonPrefixWith,
00537     PointerMonikerImpl_RelativePathTo,
00538     PointerMonikerImpl_GetDisplayName,
00539     PointerMonikerImpl_ParseDisplayName,
00540     PointerMonikerImpl_IsSystemMoniker
00541 };
00542 
00543 /******************************************************************************
00544  *         PointerMoniker_Construct (local function)
00545  *******************************************************************************/
00546 static void PointerMonikerImpl_Construct(PointerMonikerImpl* This, IUnknown *punk)
00547 {
00548     TRACE("(%p)\n",This);
00549 
00550     /* Initialize the virtual function table. */
00551     This->IMoniker_iface.lpVtbl = &VT_PointerMonikerImpl;
00552     This->ref = 1;
00553     if (punk)
00554         IUnknown_AddRef(punk);
00555     This->pObject      = punk;
00556 }
00557 
00558 /***********************************************************************
00559  *           CreatePointerMoniker (OLE32.@)
00560  *
00561  * Creates a moniker which represents a pointer.
00562  *
00563  * PARAMS
00564  *  punk [I] Pointer to the object to represent.
00565  *  ppmk [O] Address that receives the pointer to the created moniker.
00566  *
00567  * RETURNS
00568  *  Success: S_OK.
00569  *  Failure: Any HRESULT code.
00570  */
00571 HRESULT WINAPI CreatePointerMoniker(LPUNKNOWN punk, LPMONIKER *ppmk)
00572 {
00573     PointerMonikerImpl *This;
00574 
00575     TRACE("(%p, %p)\n", punk, ppmk);
00576 
00577     if (!ppmk)
00578         return E_INVALIDARG;
00579 
00580     This = HeapAlloc(GetProcessHeap(), 0, sizeof(*This));
00581     if (!This)
00582     {
00583         *ppmk = NULL;
00584         return E_OUTOFMEMORY;
00585     }
00586 
00587     PointerMonikerImpl_Construct(This, punk);
00588     *ppmk = &This->IMoniker_iface;
00589     return S_OK;
00590 }
00591 
00592 static HRESULT WINAPI PointerMonikerCF_QueryInterface(LPCLASSFACTORY iface,
00593                                                   REFIID riid, LPVOID *ppv)
00594 {
00595     *ppv = NULL;
00596     if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IClassFactory))
00597     {
00598         *ppv = iface;
00599         IUnknown_AddRef(iface);
00600         return S_OK;
00601     }
00602     return E_NOINTERFACE;
00603 }
00604 
00605 static ULONG WINAPI PointerMonikerCF_AddRef(LPCLASSFACTORY iface)
00606 {
00607     return 2; /* non-heap based object */
00608 }
00609 
00610 static ULONG WINAPI PointerMonikerCF_Release(LPCLASSFACTORY iface)
00611 {
00612     return 1; /* non-heap based object */
00613 }
00614 
00615 static HRESULT WINAPI PointerMonikerCF_CreateInstance(LPCLASSFACTORY iface,
00616     LPUNKNOWN pUnk, REFIID riid, LPVOID *ppv)
00617 {
00618     IMoniker *pMoniker;
00619     HRESULT  hr;
00620 
00621     TRACE("(%p, %s, %p)\n", pUnk, debugstr_guid(riid), ppv);
00622 
00623     *ppv = NULL;
00624 
00625     if (pUnk)
00626         return CLASS_E_NOAGGREGATION;
00627 
00628     hr = CreatePointerMoniker(NULL, &pMoniker);
00629     if (FAILED(hr))
00630         return hr;
00631 
00632     hr = IMoniker_QueryInterface(pMoniker, riid, ppv);
00633 
00634     if (FAILED(hr))
00635         IMoniker_Release(pMoniker);
00636 
00637     return hr;
00638 }
00639 
00640 static HRESULT WINAPI PointerMonikerCF_LockServer(LPCLASSFACTORY iface, BOOL fLock)
00641 {
00642     FIXME("(%d), stub!\n",fLock);
00643     return S_OK;
00644 }
00645 
00646 static const IClassFactoryVtbl PointerMonikerCFVtbl =
00647 {
00648     PointerMonikerCF_QueryInterface,
00649     PointerMonikerCF_AddRef,
00650     PointerMonikerCF_Release,
00651     PointerMonikerCF_CreateInstance,
00652     PointerMonikerCF_LockServer
00653 };
00654 static const IClassFactoryVtbl *PointerMonikerCF = &PointerMonikerCFVtbl;
00655 
00656 HRESULT PointerMonikerCF_Create(REFIID riid, LPVOID *ppv)
00657 {
00658     return IClassFactory_QueryInterface((IClassFactory *)&PointerMonikerCF, riid, ppv);
00659 }

Generated on Thu May 24 2012 04:26:06 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.