2 * Pointer and Objref Monikers Implementation
4 * Copyright 1999 Noomen Hamza
5 * Copyright 2008 Robert Shearman (for CodeWeavers)
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
32 #include "wine/debug.h"
35 WINE_DEFAULT_DEBUG_CHANNEL(ole
);
37 /* PointerMoniker data structure */
38 typedef struct PointerMonikerImpl
40 IMoniker IMoniker_iface
;
41 IMarshal IMarshal_iface
;
48 static inline PointerMonikerImpl
*impl_from_IMoniker(IMoniker
*iface
)
50 return CONTAINING_RECORD(iface
, PointerMonikerImpl
, IMoniker_iface
);
53 static PointerMonikerImpl
*impl_from_IMarshal(IMarshal
*iface
)
55 return CONTAINING_RECORD(iface
, PointerMonikerImpl
, IMarshal_iface
);
58 static PointerMonikerImpl
*unsafe_impl_from_IMoniker(IMoniker
*iface
);
60 static HRESULT WINAPI
PointerMonikerImpl_QueryInterface(IMoniker
*iface
, REFIID riid
, void **ppvObject
)
62 PointerMonikerImpl
*moniker
= impl_from_IMoniker(iface
);
64 TRACE("%p, %s, %p.\n", iface
, debugstr_guid(riid
), ppvObject
);
71 if (IsEqualIID(&IID_IUnknown
, riid
) ||
72 IsEqualIID(&IID_IPersist
, riid
) ||
73 IsEqualIID(&IID_IPersistStream
, riid
) ||
74 IsEqualIID(&IID_IMoniker
, riid
) ||
75 IsEqualGUID(&CLSID_PointerMoniker
, riid
))
79 else if (IsEqualIID(&IID_IMarshal
, riid
))
80 *ppvObject
= &moniker
->IMarshal_iface
;
85 IMoniker_AddRef(iface
);
90 static ULONG WINAPI
PointerMonikerImpl_AddRef(IMoniker
*iface
)
92 PointerMonikerImpl
*moniker
= impl_from_IMoniker(iface
);
93 ULONG refcount
= InterlockedIncrement(&moniker
->refcount
);
95 TRACE("%p, refcount %lu.\n", iface
, refcount
);
100 static ULONG WINAPI
PointerMonikerImpl_Release(IMoniker
*iface
)
102 PointerMonikerImpl
*moniker
= impl_from_IMoniker(iface
);
103 ULONG refcount
= InterlockedDecrement(&moniker
->refcount
);
105 TRACE("%p, refcount %lu.\n", iface
, refcount
);
109 if (moniker
->pObject
) IUnknown_Release(moniker
->pObject
);
116 /******************************************************************************
117 * PointerMoniker_GetClassID
118 ******************************************************************************/
119 static HRESULT WINAPI
120 PointerMonikerImpl_GetClassID(IMoniker
* iface
,CLSID
*pClassID
)
122 TRACE("(%p,%p)\n",iface
,pClassID
);
127 *pClassID
= CLSID_PointerMoniker
;
132 /******************************************************************************
133 * PointerMoniker_IsDirty
134 ******************************************************************************/
135 static HRESULT WINAPI
136 PointerMonikerImpl_IsDirty(IMoniker
* iface
)
138 /* Note that the OLE-provided implementations of the IPersistStream::IsDirty
139 method in the OLE-provided moniker interfaces always return S_FALSE because
140 their internal state never changes. */
142 TRACE("(%p)\n",iface
);
147 /******************************************************************************
148 * PointerMoniker_Load
149 ******************************************************************************/
150 static HRESULT WINAPI
151 PointerMonikerImpl_Load(IMoniker
* iface
,IStream
* pStm
)
153 TRACE("(%p)\n", pStm
);
158 /******************************************************************************
159 * PointerMoniker_Save
160 ******************************************************************************/
161 static HRESULT WINAPI
162 PointerMonikerImpl_Save(IMoniker
* iface
, IStream
* pStm
, BOOL fClearDirty
)
164 TRACE("(%p, %d)\n", pStm
, fClearDirty
);
169 /******************************************************************************
170 * PointerMoniker_GetSizeMax
173 * pcbSize [out] Pointer to size of stream needed to save object
174 ******************************************************************************/
175 static HRESULT WINAPI
176 PointerMonikerImpl_GetSizeMax(IMoniker
* iface
, ULARGE_INTEGER
* pcbSize
)
178 TRACE("(%p,%p)\n",iface
,pcbSize
);
183 pcbSize
->u
.LowPart
= 0;
184 pcbSize
->u
.HighPart
= 0;
189 /******************************************************************************
190 * PointerMoniker_BindToObject
191 ******************************************************************************/
192 static HRESULT WINAPI
193 PointerMonikerImpl_BindToObject(IMoniker
* iface
, IBindCtx
* pbc
, IMoniker
* pmkToLeft
,
194 REFIID riid
, VOID
** ppvResult
)
196 PointerMonikerImpl
*This
= impl_from_IMoniker(iface
);
198 TRACE("(%p,%p,%p,%s,%p)\n",iface
,pbc
,pmkToLeft
,debugstr_guid(riid
),ppvResult
);
203 return IUnknown_QueryInterface(This
->pObject
, riid
, ppvResult
);
206 /******************************************************************************
207 * PointerMoniker_BindToStorage
208 ******************************************************************************/
209 static HRESULT WINAPI
210 PointerMonikerImpl_BindToStorage(IMoniker
* iface
, IBindCtx
* pbc
, IMoniker
* pmkToLeft
,
211 REFIID riid
, VOID
** ppvResult
)
213 PointerMonikerImpl
*This
= impl_from_IMoniker(iface
);
215 TRACE("(%p,%p,%p,%s,%p)\n",iface
,pbc
,pmkToLeft
,debugstr_guid(riid
),ppvResult
);
220 return IUnknown_QueryInterface(This
->pObject
, riid
, ppvResult
);
223 /******************************************************************************
224 * PointerMoniker_Reduce
225 ******************************************************************************/
226 static HRESULT WINAPI
227 PointerMonikerImpl_Reduce(IMoniker
* iface
, IBindCtx
* pbc
, DWORD dwReduceHowFar
,
228 IMoniker
** ppmkToLeft
, IMoniker
** ppmkReduced
)
230 TRACE("%p, %p, %ld, %p, %p.\n", iface
, pbc
, dwReduceHowFar
, ppmkToLeft
, ppmkReduced
);
232 if (ppmkReduced
==NULL
)
235 PointerMonikerImpl_AddRef(iface
);
239 return MK_S_REDUCED_TO_SELF
;
242 static HRESULT WINAPI
PointerMonikerImpl_ComposeWith(IMoniker
*iface
, IMoniker
*right
,
243 BOOL only_if_not_generic
, IMoniker
**result
)
247 TRACE("%p, %p, %d, %p.\n", iface
, right
, only_if_not_generic
, result
);
249 if (!result
|| !right
)
254 if (is_anti_moniker(right
, &order
))
255 return order
> 1 ? create_anti_moniker(order
- 1, result
) : S_OK
;
257 return only_if_not_generic
? MK_E_NEEDGENERIC
: CreateGenericComposite(iface
, right
, result
);
260 /******************************************************************************
261 * PointerMoniker_Enum
262 ******************************************************************************/
263 static HRESULT WINAPI
PointerMonikerImpl_Enum(IMoniker
*iface
, BOOL fForward
, IEnumMoniker
**ppenumMoniker
)
265 TRACE("%p, %d, %p.\n", iface
, fForward
, ppenumMoniker
);
270 *ppenumMoniker
= NULL
;
275 /******************************************************************************
276 * PointerMoniker_IsEqual
277 ******************************************************************************/
278 static HRESULT WINAPI
PointerMonikerImpl_IsEqual(IMoniker
*iface
, IMoniker
*other
)
280 PointerMonikerImpl
*moniker
= impl_from_IMoniker(iface
), *other_moniker
;
282 TRACE("%p, %p.\n", iface
, other
);
287 other_moniker
= unsafe_impl_from_IMoniker(other
);
291 return moniker
->pObject
== other_moniker
->pObject
? S_OK
: S_FALSE
;
294 /******************************************************************************
295 * PointerMoniker_Hash
296 ******************************************************************************/
297 static HRESULT WINAPI
PointerMonikerImpl_Hash(IMoniker
* iface
,DWORD
* pdwHash
)
299 PointerMonikerImpl
*This
= impl_from_IMoniker(iface
);
304 *pdwHash
= PtrToUlong(This
->pObject
);
309 /******************************************************************************
310 * PointerMoniker_IsRunning
311 ******************************************************************************/
312 static HRESULT WINAPI
313 PointerMonikerImpl_IsRunning(IMoniker
* iface
, IBindCtx
* pbc
, IMoniker
* pmkToLeft
,
314 IMoniker
* pmkNewlyRunning
)
316 TRACE("(%p,%p,%p,%p)\n",iface
,pbc
,pmkToLeft
,pmkNewlyRunning
);
321 /******************************************************************************
322 * PointerMoniker_GetTimeOfLastChange
323 ******************************************************************************/
324 static HRESULT WINAPI
PointerMonikerImpl_GetTimeOfLastChange(IMoniker
* iface
,
329 TRACE("(%p,%p,%p,%p)\n",iface
,pbc
,pmkToLeft
,pAntiTime
);
333 /******************************************************************************
334 * PointerMoniker_Inverse
335 ******************************************************************************/
336 static HRESULT WINAPI
337 PointerMonikerImpl_Inverse(IMoniker
* iface
,IMoniker
** ppmk
)
339 TRACE("(%p,%p)\n",iface
,ppmk
);
341 return CreateAntiMoniker(ppmk
);
344 /******************************************************************************
345 * PointerMoniker_CommonPrefixWith
346 ******************************************************************************/
347 static HRESULT WINAPI
PointerMonikerImpl_CommonPrefixWith(IMoniker
*iface
, IMoniker
*other
, IMoniker
**prefix
)
349 TRACE("%p, %p, %p.\n", iface
, other
, prefix
);
351 if (!prefix
|| !other
)
356 if (PointerMonikerImpl_IsEqual(iface
, other
) == S_OK
)
358 IMoniker_AddRef(iface
);
365 return MK_E_NOPREFIX
;
368 static HRESULT WINAPI
PointerMonikerImpl_RelativePathTo(IMoniker
*iface
, IMoniker
*other
, IMoniker
**result
)
370 TRACE("%p, %p, %p.\n", iface
, other
, result
);
377 return other
? E_NOTIMPL
: E_INVALIDARG
;
380 static HRESULT WINAPI
PointerMonikerImpl_GetDisplayName(IMoniker
*iface
, IBindCtx
*pbc
,
381 IMoniker
*toleft
, LPOLESTR
*name
)
383 TRACE("%p, %p, %p, %p.\n", iface
, pbc
, toleft
, name
);
387 if (name
) *name
= NULL
;
394 /******************************************************************************
395 * PointerMoniker_ParseDisplayName
396 ******************************************************************************/
397 static HRESULT WINAPI
398 PointerMonikerImpl_ParseDisplayName(IMoniker
* iface
, IBindCtx
* pbc
,
399 IMoniker
* pmkToLeft
, LPOLESTR pszDisplayName
,
400 ULONG
* pchEaten
, IMoniker
** ppmkOut
)
402 PointerMonikerImpl
*This
= impl_from_IMoniker(iface
);
404 IParseDisplayName
*pPDN
;
406 TRACE("(%p,%p,%p,%p,%p,%p)\n",iface
,pbc
,pmkToLeft
,pszDisplayName
,pchEaten
,ppmkOut
);
414 hr
= IUnknown_QueryInterface(This
->pObject
, &IID_IParseDisplayName
, (void **)&pPDN
);
418 hr
= IParseDisplayName_ParseDisplayName(pPDN
, pbc
, pszDisplayName
, pchEaten
, ppmkOut
);
419 IParseDisplayName_Release(pPDN
);
424 /******************************************************************************
425 * PointerMoniker_IsSystemMoniker
426 ******************************************************************************/
427 static HRESULT WINAPI
428 PointerMonikerImpl_IsSystemMoniker(IMoniker
* iface
,DWORD
* pwdMksys
)
430 TRACE("(%p,%p)\n",iface
,pwdMksys
);
435 *pwdMksys
= MKSYS_POINTERMONIKER
;
440 /********************************************************************************/
441 /* Virtual function table for the PointerMonikerImpl class which include IPersist,*/
442 /* IPersistStream and IMoniker functions. */
443 static const IMonikerVtbl VT_PointerMonikerImpl
=
445 PointerMonikerImpl_QueryInterface
,
446 PointerMonikerImpl_AddRef
,
447 PointerMonikerImpl_Release
,
448 PointerMonikerImpl_GetClassID
,
449 PointerMonikerImpl_IsDirty
,
450 PointerMonikerImpl_Load
,
451 PointerMonikerImpl_Save
,
452 PointerMonikerImpl_GetSizeMax
,
453 PointerMonikerImpl_BindToObject
,
454 PointerMonikerImpl_BindToStorage
,
455 PointerMonikerImpl_Reduce
,
456 PointerMonikerImpl_ComposeWith
,
457 PointerMonikerImpl_Enum
,
458 PointerMonikerImpl_IsEqual
,
459 PointerMonikerImpl_Hash
,
460 PointerMonikerImpl_IsRunning
,
461 PointerMonikerImpl_GetTimeOfLastChange
,
462 PointerMonikerImpl_Inverse
,
463 PointerMonikerImpl_CommonPrefixWith
,
464 PointerMonikerImpl_RelativePathTo
,
465 PointerMonikerImpl_GetDisplayName
,
466 PointerMonikerImpl_ParseDisplayName
,
467 PointerMonikerImpl_IsSystemMoniker
470 static PointerMonikerImpl
*unsafe_impl_from_IMoniker(IMoniker
*iface
)
472 if (iface
->lpVtbl
!= &VT_PointerMonikerImpl
)
474 return CONTAINING_RECORD(iface
, PointerMonikerImpl
, IMoniker_iface
);
477 static HRESULT WINAPI
pointer_moniker_marshal_QueryInterface(IMarshal
*iface
, REFIID riid
, LPVOID
*ppv
)
479 PointerMonikerImpl
*moniker
= impl_from_IMarshal(iface
);
481 TRACE("%p, %s, %p.\n", iface
, debugstr_guid(riid
), ppv
);
483 return IMoniker_QueryInterface(&moniker
->IMoniker_iface
, riid
, ppv
);
486 static ULONG WINAPI
pointer_moniker_marshal_AddRef(IMarshal
*iface
)
488 PointerMonikerImpl
*moniker
= impl_from_IMarshal(iface
);
490 TRACE("%p.\n",iface
);
492 return IMoniker_AddRef(&moniker
->IMoniker_iface
);
495 static ULONG WINAPI
pointer_moniker_marshal_Release(IMarshal
*iface
)
497 PointerMonikerImpl
*moniker
= impl_from_IMarshal(iface
);
499 TRACE("%p.\n",iface
);
501 return IMoniker_Release(&moniker
->IMoniker_iface
);
504 static HRESULT WINAPI
pointer_moniker_marshal_GetUnmarshalClass(IMarshal
*iface
, REFIID riid
, void *pv
,
505 DWORD dwDestContext
, void *pvDestContext
, DWORD mshlflags
, CLSID
*clsid
)
507 PointerMonikerImpl
*moniker
= impl_from_IMarshal(iface
);
509 TRACE("%p, %s, %p, %lx, %p, %lx, %p.\n", iface
, debugstr_guid(riid
), pv
, dwDestContext
, pvDestContext
,
512 return IMoniker_GetClassID(&moniker
->IMoniker_iface
, clsid
);
515 static HRESULT WINAPI
pointer_moniker_marshal_GetMarshalSizeMax(IMarshal
*iface
, REFIID riid
, void *pv
,
516 DWORD dwDestContext
, void *pvDestContext
, DWORD mshlflags
, DWORD
*size
)
518 PointerMonikerImpl
*moniker
= impl_from_IMarshal(iface
);
520 TRACE("%p, %s, %p, %ld, %p, %#lx, %p.\n", iface
, debugstr_guid(riid
), pv
, dwDestContext
, pvDestContext
,
523 return CoGetMarshalSizeMax(size
, &IID_IUnknown
, moniker
->pObject
, dwDestContext
, pvDestContext
, mshlflags
);
526 static HRESULT WINAPI
pointer_moniker_marshal_MarshalInterface(IMarshal
*iface
, IStream
*stream
, REFIID riid
,
527 void *pv
, DWORD dwDestContext
, void *pvDestContext
, DWORD mshlflags
)
529 PointerMonikerImpl
*moniker
= impl_from_IMarshal(iface
);
531 TRACE("%p, %s, %p, %lx, %p, %lx.\n", stream
, debugstr_guid(riid
), pv
,
532 dwDestContext
, pvDestContext
, mshlflags
);
534 return CoMarshalInterface(stream
, &IID_IUnknown
, moniker
->pObject
, dwDestContext
,
535 pvDestContext
, mshlflags
);
538 static HRESULT WINAPI
pointer_moniker_marshal_UnmarshalInterface(IMarshal
*iface
, IStream
*stream
,
539 REFIID riid
, void **ppv
)
541 PointerMonikerImpl
*moniker
= impl_from_IMarshal(iface
);
545 TRACE("%p, %p, %s, %p.\n", iface
, stream
, debugstr_guid(riid
), ppv
);
547 hr
= CoUnmarshalInterface(stream
, &IID_IUnknown
, (void **)&object
);
550 ERR("Couldn't unmarshal moniker, hr = %#lx.\n", hr
);
554 if (moniker
->pObject
)
555 IUnknown_Release(moniker
->pObject
);
556 moniker
->pObject
= object
;
558 return IMoniker_QueryInterface(&moniker
->IMoniker_iface
, riid
, ppv
);
561 static HRESULT WINAPI
pointer_moniker_marshal_ReleaseMarshalData(IMarshal
*iface
, IStream
*stream
)
563 TRACE("%p, %p.\n", iface
, stream
);
568 static HRESULT WINAPI
pointer_moniker_marshal_DisconnectObject(IMarshal
*iface
, DWORD reserved
)
570 TRACE("%p, %#lx.\n", iface
, reserved
);
575 static const IMarshalVtbl pointer_moniker_marshal_vtbl
=
577 pointer_moniker_marshal_QueryInterface
,
578 pointer_moniker_marshal_AddRef
,
579 pointer_moniker_marshal_Release
,
580 pointer_moniker_marshal_GetUnmarshalClass
,
581 pointer_moniker_marshal_GetMarshalSizeMax
,
582 pointer_moniker_marshal_MarshalInterface
,
583 pointer_moniker_marshal_UnmarshalInterface
,
584 pointer_moniker_marshal_ReleaseMarshalData
,
585 pointer_moniker_marshal_DisconnectObject
588 /***********************************************************************
589 * CreatePointerMoniker (OLE32.@)
591 HRESULT WINAPI
CreatePointerMoniker(IUnknown
*object
, IMoniker
**ret
)
593 PointerMonikerImpl
*moniker
;
595 TRACE("(%p, %p)\n", object
, ret
);
600 if (!(moniker
= calloc(1, sizeof(*moniker
))))
603 return E_OUTOFMEMORY
;
606 moniker
->IMoniker_iface
.lpVtbl
= &VT_PointerMonikerImpl
;
607 moniker
->IMarshal_iface
.lpVtbl
= &pointer_moniker_marshal_vtbl
;
608 moniker
->refcount
= 1;
609 moniker
->pObject
= object
;
610 if (moniker
->pObject
)
611 IUnknown_AddRef(moniker
->pObject
);
613 *ret
= &moniker
->IMoniker_iface
;
618 HRESULT WINAPI
PointerMoniker_CreateInstance(IClassFactory
*iface
,
619 IUnknown
*pUnk
, REFIID riid
, void **ppv
)
624 TRACE("(%p, %s, %p)\n", pUnk
, debugstr_guid(riid
), ppv
);
629 return CLASS_E_NOAGGREGATION
;
631 hr
= CreatePointerMoniker(NULL
, &pMoniker
);
635 hr
= IMoniker_QueryInterface(pMoniker
, riid
, ppv
);
636 IMoniker_Release(pMoniker
);
641 /* ObjrefMoniker implementation */
645 IMoniker IMoniker_iface
;
646 IMarshal IMarshal_iface
;
653 static inline ObjrefMonikerImpl
*objref_impl_from_IMoniker(IMoniker
*iface
)
655 return CONTAINING_RECORD(iface
, ObjrefMonikerImpl
, IMoniker_iface
);
658 static ObjrefMonikerImpl
*objref_impl_from_IMarshal(IMarshal
*iface
)
660 return CONTAINING_RECORD(iface
, ObjrefMonikerImpl
, IMarshal_iface
);
663 static HRESULT WINAPI
ObjrefMonikerImpl_QueryInterface(IMoniker
*iface
, REFIID iid
, void **obj
)
665 ObjrefMonikerImpl
*moniker
= objref_impl_from_IMoniker(iface
);
667 TRACE("(%p,%s,%p)\n", iface
, debugstr_guid(iid
), obj
);
674 if (IsEqualIID(iid
, &IID_IUnknown
) ||
675 IsEqualIID(iid
, &IID_IPersist
) ||
676 IsEqualIID(iid
, &IID_IPersistStream
) ||
677 IsEqualIID(iid
, &IID_IMoniker
) ||
678 IsEqualGUID(iid
, &CLSID_ObjrefMoniker
) ||
679 IsEqualGUID(iid
, &CLSID_PointerMoniker
))
683 else if (IsEqualIID(iid
, &IID_IMarshal
))
684 *obj
= &moniker
->IMarshal_iface
;
686 return E_NOINTERFACE
;
688 IMoniker_AddRef(iface
);
693 static ULONG WINAPI
ObjrefMonikerImpl_AddRef(IMoniker
*iface
)
695 ObjrefMonikerImpl
*moniker
= objref_impl_from_IMoniker(iface
);
696 ULONG refcount
= InterlockedIncrement(&moniker
->refcount
);
698 TRACE("%p, refcount %lu\n", iface
, refcount
);
703 static ULONG WINAPI
ObjrefMonikerImpl_Release(IMoniker
*iface
)
705 ObjrefMonikerImpl
*moniker
= objref_impl_from_IMoniker(iface
);
706 ULONG refcount
= InterlockedDecrement(&moniker
->refcount
);
708 TRACE("%p, refcount %lu\n", iface
, refcount
);
712 if (moniker
->pObject
) IUnknown_Release(moniker
->pObject
);
719 static HRESULT WINAPI
ObjrefMonikerImpl_GetClassID(IMoniker
*iface
, CLSID
*clsid
)
721 TRACE("(%p,%p)\n", iface
, clsid
);
726 *clsid
= CLSID_ObjrefMoniker
;
730 static HRESULT WINAPI
ObjrefMonikerImpl_IsDirty(IMoniker
*iface
)
732 FIXME("(%p): stub\n", iface
);
736 static HRESULT WINAPI
ObjrefMonikerImpl_Load(IMoniker
*iface
, IStream
*stream
)
738 FIXME("(%p,%p): stub\n", iface
, stream
);
742 static HRESULT WINAPI
ObjrefMonikerImpl_Save(IMoniker
*iface
, IStream
*stream
, BOOL dirty
)
744 FIXME("(%p,%p,%d): stub\n", iface
, stream
, dirty
);
748 static HRESULT WINAPI
ObjrefMonikerImpl_GetSizeMax(IMoniker
*iface
, ULARGE_INTEGER
*size
)
750 FIXME("(%p,%p): stub\n", iface
, size
);
754 static HRESULT WINAPI
ObjrefMonikerImpl_BindToObject(IMoniker
*iface
, IBindCtx
*pbc
, IMoniker
*left
,
755 REFIID riid
, void **result
)
757 FIXME("(%p,%p,%p,%s,%p): stub\n", iface
, pbc
, left
, debugstr_guid(riid
), result
);
761 static HRESULT WINAPI
ObjrefMonikerImpl_BindToStorage(IMoniker
*iface
, IBindCtx
*pbc
, IMoniker
*left
,
762 REFIID riid
, void **result
)
764 FIXME("(%p,%p,%p,%s,%p): stub\n", iface
, pbc
, left
, debugstr_guid(riid
), result
);
768 static HRESULT WINAPI
ObjrefMonikerImpl_Reduce(IMoniker
*iface
, IBindCtx
*pbc
, DWORD howfar
,
769 IMoniker
**left
, IMoniker
**reduced
)
771 FIXME("%p, %p, %ld, %p, %p: stub\n", iface
, pbc
, howfar
, left
, reduced
);
775 static HRESULT WINAPI
ObjrefMonikerImpl_ComposeWith(IMoniker
*iface
, IMoniker
*right
,
776 BOOL only_if_not_generic
, IMoniker
**result
)
778 FIXME("(%p,%p,%d,%p): stub\n", iface
, right
, only_if_not_generic
, result
);
782 static HRESULT WINAPI
ObjrefMonikerImpl_Enum(IMoniker
*iface
, BOOL forward
, IEnumMoniker
**enummoniker
)
784 TRACE("(%p,%d,%p)\n", iface
, forward
, enummoniker
);
793 static HRESULT WINAPI
ObjrefMonikerImpl_IsEqual(IMoniker
*iface
, IMoniker
*other
)
795 FIXME("(%p,%p): stub\n", iface
, other
);
799 static HRESULT WINAPI
ObjrefMonikerImpl_Hash(IMoniker
*iface
, DWORD
*hash
)
801 ObjrefMonikerImpl
*moniker
= objref_impl_from_IMoniker(iface
);
803 TRACE("(%p,%p)\n", iface
, hash
);
808 *hash
= PtrToUlong(moniker
->pObject
);
813 static HRESULT WINAPI
ObjrefMonikerImpl_IsRunning(IMoniker
*iface
, IBindCtx
*pbc
, IMoniker
*left
,
816 FIXME("(%p,%p,%p,%p): stub\n", iface
, pbc
, left
, running
);
820 static HRESULT WINAPI
ObjrefMonikerImpl_GetTimeOfLastChange(IMoniker
*iface
,
821 IBindCtx
*pbc
, IMoniker
*left
, FILETIME
*time
)
823 FIXME("(%p,%p,%p,%p): stub\n", iface
, pbc
, left
, time
);
824 return MK_E_UNAVAILABLE
;
827 static HRESULT WINAPI
ObjrefMonikerImpl_Inverse(IMoniker
*iface
, IMoniker
**moniker
)
829 FIXME("(%p,%p): stub\n", iface
, moniker
);
833 static HRESULT WINAPI
ObjrefMonikerImpl_CommonPrefixWith(IMoniker
*iface
, IMoniker
*other
, IMoniker
**prefix
)
835 FIXME("(%p,%p,%p): stub\n", iface
, other
, prefix
);
839 static HRESULT WINAPI
ObjrefMonikerImpl_RelativePathTo(IMoniker
*iface
, IMoniker
*other
, IMoniker
**result
)
841 FIXME("(%p,%p,%p): stub\n", iface
, other
, result
);
845 static HRESULT WINAPI
ObjrefMonikerImpl_GetDisplayName(IMoniker
*iface
, IBindCtx
*pbc
,
846 IMoniker
*left
, LPOLESTR
*name
)
848 FIXME("(%p,%p,%p,%p): stub\n", iface
, pbc
, left
, name
);
852 static HRESULT WINAPI
ObjrefMonikerImpl_ParseDisplayName(IMoniker
*iface
, IBindCtx
*pbc
,
853 IMoniker
*left
, LPOLESTR name
, ULONG
*eaten
, IMoniker
**out
)
855 FIXME("(%p,%p,%p,%p,%p,%p): stub\n", iface
, pbc
, left
, name
, eaten
, out
);
859 static HRESULT WINAPI
ObjrefMonikerImpl_IsSystemMoniker(IMoniker
*iface
, DWORD
*mksys
)
861 TRACE("(%p,%p)\n", iface
, mksys
);
866 *mksys
= MKSYS_OBJREFMONIKER
;
870 static const IMonikerVtbl VT_ObjrefMonikerImpl
=
872 ObjrefMonikerImpl_QueryInterface
,
873 ObjrefMonikerImpl_AddRef
,
874 ObjrefMonikerImpl_Release
,
875 ObjrefMonikerImpl_GetClassID
,
876 ObjrefMonikerImpl_IsDirty
,
877 ObjrefMonikerImpl_Load
,
878 ObjrefMonikerImpl_Save
,
879 ObjrefMonikerImpl_GetSizeMax
,
880 ObjrefMonikerImpl_BindToObject
,
881 ObjrefMonikerImpl_BindToStorage
,
882 ObjrefMonikerImpl_Reduce
,
883 ObjrefMonikerImpl_ComposeWith
,
884 ObjrefMonikerImpl_Enum
,
885 ObjrefMonikerImpl_IsEqual
,
886 ObjrefMonikerImpl_Hash
,
887 ObjrefMonikerImpl_IsRunning
,
888 ObjrefMonikerImpl_GetTimeOfLastChange
,
889 ObjrefMonikerImpl_Inverse
,
890 ObjrefMonikerImpl_CommonPrefixWith
,
891 ObjrefMonikerImpl_RelativePathTo
,
892 ObjrefMonikerImpl_GetDisplayName
,
893 ObjrefMonikerImpl_ParseDisplayName
,
894 ObjrefMonikerImpl_IsSystemMoniker
897 static HRESULT WINAPI
objref_moniker_marshal_QueryInterface(IMarshal
*iface
, REFIID riid
, LPVOID
*ppv
)
899 ObjrefMonikerImpl
*moniker
= objref_impl_from_IMarshal(iface
);
901 TRACE("(%p,%s,%p)\n", iface
, debugstr_guid(riid
), ppv
);
903 return IMoniker_QueryInterface(&moniker
->IMoniker_iface
, riid
, ppv
);
906 static ULONG WINAPI
objref_moniker_marshal_AddRef(IMarshal
*iface
)
908 ObjrefMonikerImpl
*moniker
= objref_impl_from_IMarshal(iface
);
910 TRACE("(%p)\n", iface
);
912 return IMoniker_AddRef(&moniker
->IMoniker_iface
);
915 static ULONG WINAPI
objref_moniker_marshal_Release(IMarshal
*iface
)
917 ObjrefMonikerImpl
*moniker
= objref_impl_from_IMarshal(iface
);
919 TRACE("(%p)\n", iface
);
921 return IMoniker_Release(&moniker
->IMoniker_iface
);
924 static HRESULT WINAPI
objref_moniker_marshal_GetUnmarshalClass(IMarshal
*iface
, REFIID riid
, void *pv
,
925 DWORD dwDestContext
, void *pvDestContext
, DWORD mshlflags
, CLSID
*clsid
)
927 ObjrefMonikerImpl
*moniker
= objref_impl_from_IMarshal(iface
);
929 TRACE("%p, %s, %p, %#lx, %p, %#lx, %p.\n", iface
, debugstr_guid(riid
), pv
, dwDestContext
, pvDestContext
,
932 return IMoniker_GetClassID(&moniker
->IMoniker_iface
, clsid
);
935 static HRESULT WINAPI
objref_moniker_marshal_GetMarshalSizeMax(IMarshal
*iface
, REFIID riid
, void *pv
,
936 DWORD dwDestContext
, void *pvDestContext
, DWORD mshlflags
, DWORD
*size
)
938 ObjrefMonikerImpl
*moniker
= objref_impl_from_IMarshal(iface
);
940 TRACE("%p, %s, %p, %#lx, %p, %#lx, %p.\n", iface
, debugstr_guid(riid
), pv
, dwDestContext
, pvDestContext
,
943 return CoGetMarshalSizeMax(size
, &IID_IUnknown
, moniker
->pObject
, dwDestContext
, pvDestContext
, mshlflags
);
946 static HRESULT WINAPI
objref_moniker_marshal_MarshalInterface(IMarshal
*iface
, IStream
*stream
, REFIID riid
,
947 void *pv
, DWORD dwDestContext
, void *pvDestContext
, DWORD mshlflags
)
949 ObjrefMonikerImpl
*moniker
= objref_impl_from_IMarshal(iface
);
951 TRACE("%p, %s, %p, %#lx, %p, %#lx\n", stream
, debugstr_guid(riid
), pv
, dwDestContext
, pvDestContext
, mshlflags
);
953 return CoMarshalInterface(stream
, &IID_IUnknown
, moniker
->pObject
, dwDestContext
, pvDestContext
, mshlflags
);
956 static HRESULT WINAPI
objref_moniker_marshal_UnmarshalInterface(IMarshal
*iface
, IStream
*stream
,
957 REFIID riid
, void **ppv
)
959 ObjrefMonikerImpl
*moniker
= objref_impl_from_IMarshal(iface
);
963 TRACE("(%p,%p,%s,%p)\n", iface
, stream
, debugstr_guid(riid
), ppv
);
965 hr
= CoUnmarshalInterface(stream
, &IID_IUnknown
, (void **)&object
);
968 ERR("Couldn't unmarshal moniker, hr = %#lx.\n", hr
);
972 if (moniker
->pObject
)
973 IUnknown_Release(moniker
->pObject
);
974 moniker
->pObject
= object
;
976 return IMoniker_QueryInterface(&moniker
->IMoniker_iface
, riid
, ppv
);
979 static HRESULT WINAPI
objref_moniker_marshal_ReleaseMarshalData(IMarshal
*iface
, IStream
*stream
)
981 TRACE("(%p,%p)\n", iface
, stream
);
985 static HRESULT WINAPI
objref_moniker_marshal_DisconnectObject(IMarshal
*iface
, DWORD reserved
)
987 TRACE("%p, %#lx.\n", iface
, reserved
);
991 static const IMarshalVtbl objref_moniker_marshal_vtbl
=
993 objref_moniker_marshal_QueryInterface
,
994 objref_moniker_marshal_AddRef
,
995 objref_moniker_marshal_Release
,
996 objref_moniker_marshal_GetUnmarshalClass
,
997 objref_moniker_marshal_GetMarshalSizeMax
,
998 objref_moniker_marshal_MarshalInterface
,
999 objref_moniker_marshal_UnmarshalInterface
,
1000 objref_moniker_marshal_ReleaseMarshalData
,
1001 objref_moniker_marshal_DisconnectObject
1004 /***********************************************************************
1005 * CreateObjrefMoniker (OLE32.@)
1007 HRESULT WINAPI
CreateObjrefMoniker(IUnknown
*obj
, IMoniker
**ret
)
1009 ObjrefMonikerImpl
*moniker
;
1011 TRACE("(%p,%p)\n", obj
, ret
);
1014 return E_INVALIDARG
;
1016 if (!(moniker
= calloc(1, sizeof(*moniker
))))
1019 return E_OUTOFMEMORY
;
1022 moniker
->IMoniker_iface
.lpVtbl
= &VT_ObjrefMonikerImpl
;
1023 moniker
->IMarshal_iface
.lpVtbl
= &objref_moniker_marshal_vtbl
;
1024 moniker
->refcount
= 1;
1025 moniker
->pObject
= obj
;
1026 if (moniker
->pObject
)
1027 IUnknown_AddRef(moniker
->pObject
);
1029 *ret
= &moniker
->IMoniker_iface
;
1034 HRESULT WINAPI
ObjrefMoniker_CreateInstance(IClassFactory
*iface
, IUnknown
*unk
, REFIID iid
, void **obj
)
1039 TRACE("(%p,%s,%p)\n", unk
, debugstr_guid(iid
), obj
);
1044 return CLASS_E_NOAGGREGATION
;
1046 hr
= CreateObjrefMoniker(NULL
, &moniker
);
1050 hr
= IMoniker_QueryInterface(moniker
, iid
, obj
);
1051 IMoniker_Release(moniker
);