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
26 #define NONAMELESSUNION
34 #include "wine/debug.h"
37 WINE_DEFAULT_DEBUG_CHANNEL(ole
);
39 /* PointerMoniker data structure */
40 typedef struct PointerMonikerImpl
42 IMoniker IMoniker_iface
;
43 IMarshal IMarshal_iface
;
50 static inline PointerMonikerImpl
*impl_from_IMoniker(IMoniker
*iface
)
52 return CONTAINING_RECORD(iface
, PointerMonikerImpl
, IMoniker_iface
);
55 static PointerMonikerImpl
*impl_from_IMarshal(IMarshal
*iface
)
57 return CONTAINING_RECORD(iface
, PointerMonikerImpl
, IMarshal_iface
);
60 static PointerMonikerImpl
*unsafe_impl_from_IMoniker(IMoniker
*iface
);
62 static HRESULT WINAPI
PointerMonikerImpl_QueryInterface(IMoniker
*iface
, REFIID riid
, void **ppvObject
)
64 PointerMonikerImpl
*moniker
= impl_from_IMoniker(iface
);
66 TRACE("%p, %s, %p.\n", iface
, debugstr_guid(riid
), ppvObject
);
73 if (IsEqualIID(&IID_IUnknown
, riid
) ||
74 IsEqualIID(&IID_IPersist
, riid
) ||
75 IsEqualIID(&IID_IPersistStream
, riid
) ||
76 IsEqualIID(&IID_IMoniker
, riid
) ||
77 IsEqualGUID(&CLSID_PointerMoniker
, riid
))
81 else if (IsEqualIID(&IID_IMarshal
, riid
))
82 *ppvObject
= &moniker
->IMarshal_iface
;
87 IMoniker_AddRef(iface
);
92 static ULONG WINAPI
PointerMonikerImpl_AddRef(IMoniker
*iface
)
94 PointerMonikerImpl
*moniker
= impl_from_IMoniker(iface
);
95 ULONG refcount
= InterlockedIncrement(&moniker
->refcount
);
97 TRACE("%p, refcount %lu.\n", iface
, refcount
);
102 static ULONG WINAPI
PointerMonikerImpl_Release(IMoniker
*iface
)
104 PointerMonikerImpl
*moniker
= impl_from_IMoniker(iface
);
105 ULONG refcount
= InterlockedDecrement(&moniker
->refcount
);
107 TRACE("%p, refcount %lu.\n", iface
, refcount
);
111 if (moniker
->pObject
) IUnknown_Release(moniker
->pObject
);
118 /******************************************************************************
119 * PointerMoniker_GetClassID
120 ******************************************************************************/
121 static HRESULT WINAPI
122 PointerMonikerImpl_GetClassID(IMoniker
* iface
,CLSID
*pClassID
)
124 TRACE("(%p,%p)\n",iface
,pClassID
);
129 *pClassID
= CLSID_PointerMoniker
;
134 /******************************************************************************
135 * PointerMoniker_IsDirty
136 ******************************************************************************/
137 static HRESULT WINAPI
138 PointerMonikerImpl_IsDirty(IMoniker
* iface
)
140 /* Note that the OLE-provided implementations of the IPersistStream::IsDirty
141 method in the OLE-provided moniker interfaces always return S_FALSE because
142 their internal state never changes. */
144 TRACE("(%p)\n",iface
);
149 /******************************************************************************
150 * PointerMoniker_Load
151 ******************************************************************************/
152 static HRESULT WINAPI
153 PointerMonikerImpl_Load(IMoniker
* iface
,IStream
* pStm
)
155 TRACE("(%p)\n", pStm
);
160 /******************************************************************************
161 * PointerMoniker_Save
162 ******************************************************************************/
163 static HRESULT WINAPI
164 PointerMonikerImpl_Save(IMoniker
* iface
, IStream
* pStm
, BOOL fClearDirty
)
166 TRACE("(%p, %d)\n", pStm
, fClearDirty
);
171 /******************************************************************************
172 * PointerMoniker_GetSizeMax
175 * pcbSize [out] Pointer to size of stream needed to save object
176 ******************************************************************************/
177 static HRESULT WINAPI
178 PointerMonikerImpl_GetSizeMax(IMoniker
* iface
, ULARGE_INTEGER
* pcbSize
)
180 TRACE("(%p,%p)\n",iface
,pcbSize
);
185 pcbSize
->u
.LowPart
= 0;
186 pcbSize
->u
.HighPart
= 0;
191 /******************************************************************************
192 * PointerMoniker_BindToObject
193 ******************************************************************************/
194 static HRESULT WINAPI
195 PointerMonikerImpl_BindToObject(IMoniker
* iface
, IBindCtx
* pbc
, IMoniker
* pmkToLeft
,
196 REFIID riid
, VOID
** ppvResult
)
198 PointerMonikerImpl
*This
= impl_from_IMoniker(iface
);
200 TRACE("(%p,%p,%p,%s,%p)\n",iface
,pbc
,pmkToLeft
,debugstr_guid(riid
),ppvResult
);
205 return IUnknown_QueryInterface(This
->pObject
, riid
, ppvResult
);
208 /******************************************************************************
209 * PointerMoniker_BindToStorage
210 ******************************************************************************/
211 static HRESULT WINAPI
212 PointerMonikerImpl_BindToStorage(IMoniker
* iface
, IBindCtx
* pbc
, IMoniker
* pmkToLeft
,
213 REFIID riid
, VOID
** ppvResult
)
215 PointerMonikerImpl
*This
= impl_from_IMoniker(iface
);
217 TRACE("(%p,%p,%p,%s,%p)\n",iface
,pbc
,pmkToLeft
,debugstr_guid(riid
),ppvResult
);
222 return IUnknown_QueryInterface(This
->pObject
, riid
, ppvResult
);
225 /******************************************************************************
226 * PointerMoniker_Reduce
227 ******************************************************************************/
228 static HRESULT WINAPI
229 PointerMonikerImpl_Reduce(IMoniker
* iface
, IBindCtx
* pbc
, DWORD dwReduceHowFar
,
230 IMoniker
** ppmkToLeft
, IMoniker
** ppmkReduced
)
232 TRACE("%p, %p, %ld, %p, %p.\n", iface
, pbc
, dwReduceHowFar
, ppmkToLeft
, ppmkReduced
);
234 if (ppmkReduced
==NULL
)
237 PointerMonikerImpl_AddRef(iface
);
241 return MK_S_REDUCED_TO_SELF
;
244 static HRESULT WINAPI
PointerMonikerImpl_ComposeWith(IMoniker
*iface
, IMoniker
*right
,
245 BOOL only_if_not_generic
, IMoniker
**result
)
249 TRACE("%p, %p, %d, %p.\n", iface
, right
, only_if_not_generic
, result
);
251 if (!result
|| !right
)
256 if (is_anti_moniker(right
, &order
))
257 return order
> 1 ? create_anti_moniker(order
- 1, result
) : S_OK
;
259 return only_if_not_generic
? MK_E_NEEDGENERIC
: CreateGenericComposite(iface
, right
, result
);
262 /******************************************************************************
263 * PointerMoniker_Enum
264 ******************************************************************************/
265 static HRESULT WINAPI
PointerMonikerImpl_Enum(IMoniker
*iface
, BOOL fForward
, IEnumMoniker
**ppenumMoniker
)
267 TRACE("%p, %d, %p.\n", iface
, fForward
, ppenumMoniker
);
272 *ppenumMoniker
= NULL
;
277 /******************************************************************************
278 * PointerMoniker_IsEqual
279 ******************************************************************************/
280 static HRESULT WINAPI
PointerMonikerImpl_IsEqual(IMoniker
*iface
, IMoniker
*other
)
282 PointerMonikerImpl
*moniker
= impl_from_IMoniker(iface
), *other_moniker
;
284 TRACE("%p, %p.\n", iface
, other
);
289 other_moniker
= unsafe_impl_from_IMoniker(other
);
293 return moniker
->pObject
== other_moniker
->pObject
? S_OK
: S_FALSE
;
296 /******************************************************************************
297 * PointerMoniker_Hash
298 ******************************************************************************/
299 static HRESULT WINAPI
PointerMonikerImpl_Hash(IMoniker
* iface
,DWORD
* pdwHash
)
301 PointerMonikerImpl
*This
= impl_from_IMoniker(iface
);
306 *pdwHash
= PtrToUlong(This
->pObject
);
311 /******************************************************************************
312 * PointerMoniker_IsRunning
313 ******************************************************************************/
314 static HRESULT WINAPI
315 PointerMonikerImpl_IsRunning(IMoniker
* iface
, IBindCtx
* pbc
, IMoniker
* pmkToLeft
,
316 IMoniker
* pmkNewlyRunning
)
318 TRACE("(%p,%p,%p,%p)\n",iface
,pbc
,pmkToLeft
,pmkNewlyRunning
);
323 /******************************************************************************
324 * PointerMoniker_GetTimeOfLastChange
325 ******************************************************************************/
326 static HRESULT WINAPI
PointerMonikerImpl_GetTimeOfLastChange(IMoniker
* iface
,
331 TRACE("(%p,%p,%p,%p)\n",iface
,pbc
,pmkToLeft
,pAntiTime
);
335 /******************************************************************************
336 * PointerMoniker_Inverse
337 ******************************************************************************/
338 static HRESULT WINAPI
339 PointerMonikerImpl_Inverse(IMoniker
* iface
,IMoniker
** ppmk
)
341 TRACE("(%p,%p)\n",iface
,ppmk
);
343 return CreateAntiMoniker(ppmk
);
346 /******************************************************************************
347 * PointerMoniker_CommonPrefixWith
348 ******************************************************************************/
349 static HRESULT WINAPI
PointerMonikerImpl_CommonPrefixWith(IMoniker
*iface
, IMoniker
*other
, IMoniker
**prefix
)
351 TRACE("%p, %p, %p.\n", iface
, other
, prefix
);
353 if (!prefix
|| !other
)
358 if (PointerMonikerImpl_IsEqual(iface
, other
) == S_OK
)
360 IMoniker_AddRef(iface
);
367 return MK_E_NOPREFIX
;
370 static HRESULT WINAPI
PointerMonikerImpl_RelativePathTo(IMoniker
*iface
, IMoniker
*other
, IMoniker
**result
)
372 TRACE("%p, %p, %p.\n", iface
, other
, result
);
379 return other
? E_NOTIMPL
: E_INVALIDARG
;
382 static HRESULT WINAPI
PointerMonikerImpl_GetDisplayName(IMoniker
*iface
, IBindCtx
*pbc
,
383 IMoniker
*toleft
, LPOLESTR
*name
)
385 TRACE("%p, %p, %p, %p.\n", iface
, pbc
, toleft
, name
);
389 if (name
) *name
= NULL
;
396 /******************************************************************************
397 * PointerMoniker_ParseDisplayName
398 ******************************************************************************/
399 static HRESULT WINAPI
400 PointerMonikerImpl_ParseDisplayName(IMoniker
* iface
, IBindCtx
* pbc
,
401 IMoniker
* pmkToLeft
, LPOLESTR pszDisplayName
,
402 ULONG
* pchEaten
, IMoniker
** ppmkOut
)
404 PointerMonikerImpl
*This
= impl_from_IMoniker(iface
);
406 IParseDisplayName
*pPDN
;
408 TRACE("(%p,%p,%p,%p,%p,%p)\n",iface
,pbc
,pmkToLeft
,pszDisplayName
,pchEaten
,ppmkOut
);
416 hr
= IUnknown_QueryInterface(This
->pObject
, &IID_IParseDisplayName
, (void **)&pPDN
);
420 hr
= IParseDisplayName_ParseDisplayName(pPDN
, pbc
, pszDisplayName
, pchEaten
, ppmkOut
);
421 IParseDisplayName_Release(pPDN
);
426 /******************************************************************************
427 * PointerMoniker_IsSystemMoniker
428 ******************************************************************************/
429 static HRESULT WINAPI
430 PointerMonikerImpl_IsSystemMoniker(IMoniker
* iface
,DWORD
* pwdMksys
)
432 TRACE("(%p,%p)\n",iface
,pwdMksys
);
437 *pwdMksys
= MKSYS_POINTERMONIKER
;
442 /********************************************************************************/
443 /* Virtual function table for the PointerMonikerImpl class which include IPersist,*/
444 /* IPersistStream and IMoniker functions. */
445 static const IMonikerVtbl VT_PointerMonikerImpl
=
447 PointerMonikerImpl_QueryInterface
,
448 PointerMonikerImpl_AddRef
,
449 PointerMonikerImpl_Release
,
450 PointerMonikerImpl_GetClassID
,
451 PointerMonikerImpl_IsDirty
,
452 PointerMonikerImpl_Load
,
453 PointerMonikerImpl_Save
,
454 PointerMonikerImpl_GetSizeMax
,
455 PointerMonikerImpl_BindToObject
,
456 PointerMonikerImpl_BindToStorage
,
457 PointerMonikerImpl_Reduce
,
458 PointerMonikerImpl_ComposeWith
,
459 PointerMonikerImpl_Enum
,
460 PointerMonikerImpl_IsEqual
,
461 PointerMonikerImpl_Hash
,
462 PointerMonikerImpl_IsRunning
,
463 PointerMonikerImpl_GetTimeOfLastChange
,
464 PointerMonikerImpl_Inverse
,
465 PointerMonikerImpl_CommonPrefixWith
,
466 PointerMonikerImpl_RelativePathTo
,
467 PointerMonikerImpl_GetDisplayName
,
468 PointerMonikerImpl_ParseDisplayName
,
469 PointerMonikerImpl_IsSystemMoniker
472 static PointerMonikerImpl
*unsafe_impl_from_IMoniker(IMoniker
*iface
)
474 if (iface
->lpVtbl
!= &VT_PointerMonikerImpl
)
476 return CONTAINING_RECORD(iface
, PointerMonikerImpl
, IMoniker_iface
);
479 static HRESULT WINAPI
pointer_moniker_marshal_QueryInterface(IMarshal
*iface
, REFIID riid
, LPVOID
*ppv
)
481 PointerMonikerImpl
*moniker
= impl_from_IMarshal(iface
);
483 TRACE("%p, %s, %p.\n", iface
, debugstr_guid(riid
), ppv
);
485 return IMoniker_QueryInterface(&moniker
->IMoniker_iface
, riid
, ppv
);
488 static ULONG WINAPI
pointer_moniker_marshal_AddRef(IMarshal
*iface
)
490 PointerMonikerImpl
*moniker
= impl_from_IMarshal(iface
);
492 TRACE("%p.\n",iface
);
494 return IMoniker_AddRef(&moniker
->IMoniker_iface
);
497 static ULONG WINAPI
pointer_moniker_marshal_Release(IMarshal
*iface
)
499 PointerMonikerImpl
*moniker
= impl_from_IMarshal(iface
);
501 TRACE("%p.\n",iface
);
503 return IMoniker_Release(&moniker
->IMoniker_iface
);
506 static HRESULT WINAPI
pointer_moniker_marshal_GetUnmarshalClass(IMarshal
*iface
, REFIID riid
, void *pv
,
507 DWORD dwDestContext
, void *pvDestContext
, DWORD mshlflags
, CLSID
*clsid
)
509 PointerMonikerImpl
*moniker
= impl_from_IMarshal(iface
);
511 TRACE("%p, %s, %p, %lx, %p, %lx, %p.\n", iface
, debugstr_guid(riid
), pv
, dwDestContext
, pvDestContext
,
514 return IMoniker_GetClassID(&moniker
->IMoniker_iface
, clsid
);
517 static HRESULT WINAPI
pointer_moniker_marshal_GetMarshalSizeMax(IMarshal
*iface
, REFIID riid
, void *pv
,
518 DWORD dwDestContext
, void *pvDestContext
, DWORD mshlflags
, DWORD
*size
)
520 PointerMonikerImpl
*moniker
= impl_from_IMarshal(iface
);
522 TRACE("%p, %s, %p, %ld, %p, %#lx, %p.\n", iface
, debugstr_guid(riid
), pv
, dwDestContext
, pvDestContext
,
525 return CoGetMarshalSizeMax(size
, &IID_IUnknown
, moniker
->pObject
, dwDestContext
, pvDestContext
, mshlflags
);
528 static HRESULT WINAPI
pointer_moniker_marshal_MarshalInterface(IMarshal
*iface
, IStream
*stream
, REFIID riid
,
529 void *pv
, DWORD dwDestContext
, void *pvDestContext
, DWORD mshlflags
)
531 PointerMonikerImpl
*moniker
= impl_from_IMarshal(iface
);
533 TRACE("%p, %s, %p, %lx, %p, %lx.\n", stream
, debugstr_guid(riid
), pv
,
534 dwDestContext
, pvDestContext
, mshlflags
);
536 return CoMarshalInterface(stream
, &IID_IUnknown
, moniker
->pObject
, dwDestContext
,
537 pvDestContext
, mshlflags
);
540 static HRESULT WINAPI
pointer_moniker_marshal_UnmarshalInterface(IMarshal
*iface
, IStream
*stream
,
541 REFIID riid
, void **ppv
)
543 PointerMonikerImpl
*moniker
= impl_from_IMarshal(iface
);
547 TRACE("%p, %p, %s, %p.\n", iface
, stream
, debugstr_guid(riid
), ppv
);
549 hr
= CoUnmarshalInterface(stream
, &IID_IUnknown
, (void **)&object
);
552 ERR("Couldn't unmarshal moniker, hr = %#lx.\n", hr
);
556 if (moniker
->pObject
)
557 IUnknown_Release(moniker
->pObject
);
558 moniker
->pObject
= object
;
560 return IMoniker_QueryInterface(&moniker
->IMoniker_iface
, riid
, ppv
);
563 static HRESULT WINAPI
pointer_moniker_marshal_ReleaseMarshalData(IMarshal
*iface
, IStream
*stream
)
565 TRACE("%p, %p.\n", iface
, stream
);
570 static HRESULT WINAPI
pointer_moniker_marshal_DisconnectObject(IMarshal
*iface
, DWORD reserved
)
572 TRACE("%p, %#lx.\n", iface
, reserved
);
577 static const IMarshalVtbl pointer_moniker_marshal_vtbl
=
579 pointer_moniker_marshal_QueryInterface
,
580 pointer_moniker_marshal_AddRef
,
581 pointer_moniker_marshal_Release
,
582 pointer_moniker_marshal_GetUnmarshalClass
,
583 pointer_moniker_marshal_GetMarshalSizeMax
,
584 pointer_moniker_marshal_MarshalInterface
,
585 pointer_moniker_marshal_UnmarshalInterface
,
586 pointer_moniker_marshal_ReleaseMarshalData
,
587 pointer_moniker_marshal_DisconnectObject
590 /***********************************************************************
591 * CreatePointerMoniker (OLE32.@)
593 HRESULT WINAPI
CreatePointerMoniker(IUnknown
*object
, IMoniker
**ret
)
595 PointerMonikerImpl
*moniker
;
597 TRACE("(%p, %p)\n", object
, ret
);
602 if (!(moniker
= calloc(1, sizeof(*moniker
))))
605 return E_OUTOFMEMORY
;
608 moniker
->IMoniker_iface
.lpVtbl
= &VT_PointerMonikerImpl
;
609 moniker
->IMarshal_iface
.lpVtbl
= &pointer_moniker_marshal_vtbl
;
610 moniker
->refcount
= 1;
611 moniker
->pObject
= object
;
612 if (moniker
->pObject
)
613 IUnknown_AddRef(moniker
->pObject
);
615 *ret
= &moniker
->IMoniker_iface
;
620 HRESULT WINAPI
PointerMoniker_CreateInstance(IClassFactory
*iface
,
621 IUnknown
*pUnk
, REFIID riid
, void **ppv
)
626 TRACE("(%p, %s, %p)\n", pUnk
, debugstr_guid(riid
), ppv
);
631 return CLASS_E_NOAGGREGATION
;
633 hr
= CreatePointerMoniker(NULL
, &pMoniker
);
637 hr
= IMoniker_QueryInterface(pMoniker
, riid
, ppv
);
638 IMoniker_Release(pMoniker
);
643 /* ObjrefMoniker implementation */
647 IMoniker IMoniker_iface
;
648 IMarshal IMarshal_iface
;
655 static inline ObjrefMonikerImpl
*objref_impl_from_IMoniker(IMoniker
*iface
)
657 return CONTAINING_RECORD(iface
, ObjrefMonikerImpl
, IMoniker_iface
);
660 static ObjrefMonikerImpl
*objref_impl_from_IMarshal(IMarshal
*iface
)
662 return CONTAINING_RECORD(iface
, ObjrefMonikerImpl
, IMarshal_iface
);
665 static HRESULT WINAPI
ObjrefMonikerImpl_QueryInterface(IMoniker
*iface
, REFIID iid
, void **obj
)
667 ObjrefMonikerImpl
*moniker
= objref_impl_from_IMoniker(iface
);
669 TRACE("(%p,%s,%p)\n", iface
, debugstr_guid(iid
), obj
);
676 if (IsEqualIID(iid
, &IID_IUnknown
) ||
677 IsEqualIID(iid
, &IID_IPersist
) ||
678 IsEqualIID(iid
, &IID_IPersistStream
) ||
679 IsEqualIID(iid
, &IID_IMoniker
) ||
680 IsEqualGUID(iid
, &CLSID_ObjrefMoniker
) ||
681 IsEqualGUID(iid
, &CLSID_PointerMoniker
))
685 else if (IsEqualIID(iid
, &IID_IMarshal
))
686 *obj
= &moniker
->IMarshal_iface
;
688 return E_NOINTERFACE
;
690 IMoniker_AddRef(iface
);
695 static ULONG WINAPI
ObjrefMonikerImpl_AddRef(IMoniker
*iface
)
697 ObjrefMonikerImpl
*moniker
= objref_impl_from_IMoniker(iface
);
698 ULONG refcount
= InterlockedIncrement(&moniker
->refcount
);
700 TRACE("%p, refcount %lu\n", iface
, refcount
);
705 static ULONG WINAPI
ObjrefMonikerImpl_Release(IMoniker
*iface
)
707 ObjrefMonikerImpl
*moniker
= objref_impl_from_IMoniker(iface
);
708 ULONG refcount
= InterlockedDecrement(&moniker
->refcount
);
710 TRACE("%p, refcount %lu\n", iface
, refcount
);
714 if (moniker
->pObject
) IUnknown_Release(moniker
->pObject
);
721 static HRESULT WINAPI
ObjrefMonikerImpl_GetClassID(IMoniker
*iface
, CLSID
*clsid
)
723 TRACE("(%p,%p)\n", iface
, clsid
);
728 *clsid
= CLSID_ObjrefMoniker
;
732 static HRESULT WINAPI
ObjrefMonikerImpl_IsDirty(IMoniker
*iface
)
734 FIXME("(%p): stub\n", iface
);
738 static HRESULT WINAPI
ObjrefMonikerImpl_Load(IMoniker
*iface
, IStream
*stream
)
740 FIXME("(%p,%p): stub\n", iface
, stream
);
744 static HRESULT WINAPI
ObjrefMonikerImpl_Save(IMoniker
*iface
, IStream
*stream
, BOOL dirty
)
746 FIXME("(%p,%p,%d): stub\n", iface
, stream
, dirty
);
750 static HRESULT WINAPI
ObjrefMonikerImpl_GetSizeMax(IMoniker
*iface
, ULARGE_INTEGER
*size
)
752 FIXME("(%p,%p): stub\n", iface
, size
);
756 static HRESULT WINAPI
ObjrefMonikerImpl_BindToObject(IMoniker
*iface
, IBindCtx
*pbc
, IMoniker
*left
,
757 REFIID riid
, void **result
)
759 FIXME("(%p,%p,%p,%s,%p): stub\n", iface
, pbc
, left
, debugstr_guid(riid
), result
);
763 static HRESULT WINAPI
ObjrefMonikerImpl_BindToStorage(IMoniker
*iface
, IBindCtx
*pbc
, IMoniker
*left
,
764 REFIID riid
, void **result
)
766 FIXME("(%p,%p,%p,%s,%p): stub\n", iface
, pbc
, left
, debugstr_guid(riid
), result
);
770 static HRESULT WINAPI
ObjrefMonikerImpl_Reduce(IMoniker
*iface
, IBindCtx
*pbc
, DWORD howfar
,
771 IMoniker
**left
, IMoniker
**reduced
)
773 FIXME("%p, %p, %ld, %p, %p: stub\n", iface
, pbc
, howfar
, left
, reduced
);
777 static HRESULT WINAPI
ObjrefMonikerImpl_ComposeWith(IMoniker
*iface
, IMoniker
*right
,
778 BOOL only_if_not_generic
, IMoniker
**result
)
780 FIXME("(%p,%p,%d,%p): stub\n", iface
, right
, only_if_not_generic
, result
);
784 static HRESULT WINAPI
ObjrefMonikerImpl_Enum(IMoniker
*iface
, BOOL forward
, IEnumMoniker
**enummoniker
)
786 TRACE("(%p,%d,%p)\n", iface
, forward
, enummoniker
);
795 static HRESULT WINAPI
ObjrefMonikerImpl_IsEqual(IMoniker
*iface
, IMoniker
*other
)
797 FIXME("(%p,%p): stub\n", iface
, other
);
801 static HRESULT WINAPI
ObjrefMonikerImpl_Hash(IMoniker
*iface
, DWORD
*hash
)
803 ObjrefMonikerImpl
*moniker
= objref_impl_from_IMoniker(iface
);
805 TRACE("(%p,%p)\n", iface
, hash
);
810 *hash
= PtrToUlong(moniker
->pObject
);
815 static HRESULT WINAPI
ObjrefMonikerImpl_IsRunning(IMoniker
*iface
, IBindCtx
*pbc
, IMoniker
*left
,
818 FIXME("(%p,%p,%p,%p): stub\n", iface
, pbc
, left
, running
);
822 static HRESULT WINAPI
ObjrefMonikerImpl_GetTimeOfLastChange(IMoniker
*iface
,
823 IBindCtx
*pbc
, IMoniker
*left
, FILETIME
*time
)
825 FIXME("(%p,%p,%p,%p): stub\n", iface
, pbc
, left
, time
);
826 return MK_E_UNAVAILABLE
;
829 static HRESULT WINAPI
ObjrefMonikerImpl_Inverse(IMoniker
*iface
, IMoniker
**moniker
)
831 FIXME("(%p,%p): stub\n", iface
, moniker
);
835 static HRESULT WINAPI
ObjrefMonikerImpl_CommonPrefixWith(IMoniker
*iface
, IMoniker
*other
, IMoniker
**prefix
)
837 FIXME("(%p,%p,%p): stub\n", iface
, other
, prefix
);
841 static HRESULT WINAPI
ObjrefMonikerImpl_RelativePathTo(IMoniker
*iface
, IMoniker
*other
, IMoniker
**result
)
843 FIXME("(%p,%p,%p): stub\n", iface
, other
, result
);
847 static HRESULT WINAPI
ObjrefMonikerImpl_GetDisplayName(IMoniker
*iface
, IBindCtx
*pbc
,
848 IMoniker
*left
, LPOLESTR
*name
)
850 FIXME("(%p,%p,%p,%p): stub\n", iface
, pbc
, left
, name
);
854 static HRESULT WINAPI
ObjrefMonikerImpl_ParseDisplayName(IMoniker
*iface
, IBindCtx
*pbc
,
855 IMoniker
*left
, LPOLESTR name
, ULONG
*eaten
, IMoniker
**out
)
857 FIXME("(%p,%p,%p,%p,%p,%p): stub\n", iface
, pbc
, left
, name
, eaten
, out
);
861 static HRESULT WINAPI
ObjrefMonikerImpl_IsSystemMoniker(IMoniker
*iface
, DWORD
*mksys
)
863 TRACE("(%p,%p)\n", iface
, mksys
);
868 *mksys
= MKSYS_OBJREFMONIKER
;
872 static const IMonikerVtbl VT_ObjrefMonikerImpl
=
874 ObjrefMonikerImpl_QueryInterface
,
875 ObjrefMonikerImpl_AddRef
,
876 ObjrefMonikerImpl_Release
,
877 ObjrefMonikerImpl_GetClassID
,
878 ObjrefMonikerImpl_IsDirty
,
879 ObjrefMonikerImpl_Load
,
880 ObjrefMonikerImpl_Save
,
881 ObjrefMonikerImpl_GetSizeMax
,
882 ObjrefMonikerImpl_BindToObject
,
883 ObjrefMonikerImpl_BindToStorage
,
884 ObjrefMonikerImpl_Reduce
,
885 ObjrefMonikerImpl_ComposeWith
,
886 ObjrefMonikerImpl_Enum
,
887 ObjrefMonikerImpl_IsEqual
,
888 ObjrefMonikerImpl_Hash
,
889 ObjrefMonikerImpl_IsRunning
,
890 ObjrefMonikerImpl_GetTimeOfLastChange
,
891 ObjrefMonikerImpl_Inverse
,
892 ObjrefMonikerImpl_CommonPrefixWith
,
893 ObjrefMonikerImpl_RelativePathTo
,
894 ObjrefMonikerImpl_GetDisplayName
,
895 ObjrefMonikerImpl_ParseDisplayName
,
896 ObjrefMonikerImpl_IsSystemMoniker
899 static HRESULT WINAPI
objref_moniker_marshal_QueryInterface(IMarshal
*iface
, REFIID riid
, LPVOID
*ppv
)
901 ObjrefMonikerImpl
*moniker
= objref_impl_from_IMarshal(iface
);
903 TRACE("(%p,%s,%p)\n", iface
, debugstr_guid(riid
), ppv
);
905 return IMoniker_QueryInterface(&moniker
->IMoniker_iface
, riid
, ppv
);
908 static ULONG WINAPI
objref_moniker_marshal_AddRef(IMarshal
*iface
)
910 ObjrefMonikerImpl
*moniker
= objref_impl_from_IMarshal(iface
);
912 TRACE("(%p)\n", iface
);
914 return IMoniker_AddRef(&moniker
->IMoniker_iface
);
917 static ULONG WINAPI
objref_moniker_marshal_Release(IMarshal
*iface
)
919 ObjrefMonikerImpl
*moniker
= objref_impl_from_IMarshal(iface
);
921 TRACE("(%p)\n", iface
);
923 return IMoniker_Release(&moniker
->IMoniker_iface
);
926 static HRESULT WINAPI
objref_moniker_marshal_GetUnmarshalClass(IMarshal
*iface
, REFIID riid
, void *pv
,
927 DWORD dwDestContext
, void *pvDestContext
, DWORD mshlflags
, CLSID
*clsid
)
929 ObjrefMonikerImpl
*moniker
= objref_impl_from_IMarshal(iface
);
931 TRACE("%p, %s, %p, %#lx, %p, %#lx, %p.\n", iface
, debugstr_guid(riid
), pv
, dwDestContext
, pvDestContext
,
934 return IMoniker_GetClassID(&moniker
->IMoniker_iface
, clsid
);
937 static HRESULT WINAPI
objref_moniker_marshal_GetMarshalSizeMax(IMarshal
*iface
, REFIID riid
, void *pv
,
938 DWORD dwDestContext
, void *pvDestContext
, DWORD mshlflags
, DWORD
*size
)
940 ObjrefMonikerImpl
*moniker
= objref_impl_from_IMarshal(iface
);
942 TRACE("%p, %s, %p, %#lx, %p, %#lx, %p.\n", iface
, debugstr_guid(riid
), pv
, dwDestContext
, pvDestContext
,
945 return CoGetMarshalSizeMax(size
, &IID_IUnknown
, moniker
->pObject
, dwDestContext
, pvDestContext
, mshlflags
);
948 static HRESULT WINAPI
objref_moniker_marshal_MarshalInterface(IMarshal
*iface
, IStream
*stream
, REFIID riid
,
949 void *pv
, DWORD dwDestContext
, void *pvDestContext
, DWORD mshlflags
)
951 ObjrefMonikerImpl
*moniker
= objref_impl_from_IMarshal(iface
);
953 TRACE("%p, %s, %p, %#lx, %p, %#lx\n", stream
, debugstr_guid(riid
), pv
, dwDestContext
, pvDestContext
, mshlflags
);
955 return CoMarshalInterface(stream
, &IID_IUnknown
, moniker
->pObject
, dwDestContext
, pvDestContext
, mshlflags
);
958 static HRESULT WINAPI
objref_moniker_marshal_UnmarshalInterface(IMarshal
*iface
, IStream
*stream
,
959 REFIID riid
, void **ppv
)
961 ObjrefMonikerImpl
*moniker
= objref_impl_from_IMarshal(iface
);
965 TRACE("(%p,%p,%s,%p)\n", iface
, stream
, debugstr_guid(riid
), ppv
);
967 hr
= CoUnmarshalInterface(stream
, &IID_IUnknown
, (void **)&object
);
970 ERR("Couldn't unmarshal moniker, hr = %#lx.\n", hr
);
974 if (moniker
->pObject
)
975 IUnknown_Release(moniker
->pObject
);
976 moniker
->pObject
= object
;
978 return IMoniker_QueryInterface(&moniker
->IMoniker_iface
, riid
, ppv
);
981 static HRESULT WINAPI
objref_moniker_marshal_ReleaseMarshalData(IMarshal
*iface
, IStream
*stream
)
983 TRACE("(%p,%p)\n", iface
, stream
);
987 static HRESULT WINAPI
objref_moniker_marshal_DisconnectObject(IMarshal
*iface
, DWORD reserved
)
989 TRACE("%p, %#lx.\n", iface
, reserved
);
993 static const IMarshalVtbl objref_moniker_marshal_vtbl
=
995 objref_moniker_marshal_QueryInterface
,
996 objref_moniker_marshal_AddRef
,
997 objref_moniker_marshal_Release
,
998 objref_moniker_marshal_GetUnmarshalClass
,
999 objref_moniker_marshal_GetMarshalSizeMax
,
1000 objref_moniker_marshal_MarshalInterface
,
1001 objref_moniker_marshal_UnmarshalInterface
,
1002 objref_moniker_marshal_ReleaseMarshalData
,
1003 objref_moniker_marshal_DisconnectObject
1006 /***********************************************************************
1007 * CreateObjrefMoniker (OLE32.@)
1009 HRESULT WINAPI
CreateObjrefMoniker(IUnknown
*obj
, IMoniker
**ret
)
1011 ObjrefMonikerImpl
*moniker
;
1013 TRACE("(%p,%p)\n", obj
, ret
);
1016 return E_INVALIDARG
;
1018 if (!(moniker
= calloc(1, sizeof(*moniker
))))
1021 return E_OUTOFMEMORY
;
1024 moniker
->IMoniker_iface
.lpVtbl
= &VT_ObjrefMonikerImpl
;
1025 moniker
->IMarshal_iface
.lpVtbl
= &objref_moniker_marshal_vtbl
;
1026 moniker
->refcount
= 1;
1027 moniker
->pObject
= obj
;
1028 if (moniker
->pObject
)
1029 IUnknown_AddRef(moniker
->pObject
);
1031 *ret
= &moniker
->IMoniker_iface
;
1036 HRESULT WINAPI
ObjrefMoniker_CreateInstance(IClassFactory
*iface
, IUnknown
*unk
, REFIID iid
, void **obj
)
1041 TRACE("(%p,%s,%p)\n", unk
, debugstr_guid(iid
), obj
);
1046 return CLASS_E_NOAGGREGATION
;
1048 hr
= CreateObjrefMoniker(NULL
, &moniker
);
1052 hr
= IMoniker_QueryInterface(moniker
, iid
, obj
);
1053 IMoniker_Release(moniker
);