Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenpointermoniker.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
1.7.6.1
|