Nikolay Sivov : ole32: Use existing code to return IMarshal from CoGetStandardMarshal().
Alexandre Julliard
julliard at winehq.org
Thu Dec 5 12:49:16 CST 2013
Module: wine
Branch: master
Commit: 97ec8b0150403d98e86a57a697a8cc6f3aca09bf
URL: http://source.winehq.org/git/wine.git/?a=commit;h=97ec8b0150403d98e86a57a697a8cc6f3aca09bf
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Thu Dec 5 08:57:33 2013 +0400
ole32: Use existing code to return IMarshal from CoGetStandardMarshal().
---
dlls/ole32/marshal.c | 50 ++++++++++++++++++++++----------------------------
1 files changed, 22 insertions(+), 28 deletions(-)
diff --git a/dlls/ole32/marshal.c b/dlls/ole32/marshal.c
index c8a02e5..4f6aee4 100644
--- a/dlls/ole32/marshal.c
+++ b/dlls/ole32/marshal.c
@@ -1166,13 +1166,10 @@ HRESULT apartment_disconnectproxies(struct apartment *apt)
/********************** StdMarshal implementation ****************************/
typedef struct _StdMarshalImpl
{
- IMarshal IMarshal_iface;
- LONG ref;
-
- IID iid;
- DWORD dwDestContext;
- LPVOID pvDestContext;
- DWORD mshlflags;
+ IMarshal IMarshal_iface;
+ LONG ref;
+ DWORD dest_context;
+ void *dest_context_data;
} StdMarshalImpl;
static inline StdMarshalImpl *impl_from_StdMarshal(IMarshal *iface)
@@ -1401,8 +1398,8 @@ StdMarshalImpl_UnmarshalInterface(IMarshal *iface, IStream *pStm, REFIID riid, v
wine_dbgstr_longlong(stdobjref.oxid));
if (hres == S_OK)
- hres = unmarshal_object(&stdobjref, apt, This->dwDestContext,
- This->pvDestContext, riid,
+ hres = unmarshal_object(&stdobjref, apt, This->dest_context,
+ This->dest_context_data, riid,
stubmgr ? &stubmgr->oxid_info : NULL, ppv);
if (stubmgr) stub_manager_int_release(stubmgr);
@@ -1476,15 +1473,24 @@ static const IMarshalVtbl StdMarshalVtbl =
StdMarshalImpl_DisconnectObject
};
-static HRESULT StdMarshalImpl_Construct(REFIID riid, void** ppvObject)
+static HRESULT StdMarshalImpl_Construct(REFIID riid, DWORD dest_context, void *dest_context_data, void** ppvObject)
{
- StdMarshalImpl * pStdMarshal =
- HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(StdMarshalImpl));
+ HRESULT hr;
+
+ StdMarshalImpl *pStdMarshal = HeapAlloc(GetProcessHeap(), 0, sizeof(StdMarshalImpl));
if (!pStdMarshal)
return E_OUTOFMEMORY;
+
pStdMarshal->IMarshal_iface.lpVtbl = &StdMarshalVtbl;
pStdMarshal->ref = 0;
- return IMarshal_QueryInterface(&pStdMarshal->IMarshal_iface, riid, ppvObject);
+ pStdMarshal->dest_context = dest_context;
+ pStdMarshal->dest_context_data = dest_context_data;
+
+ hr = IMarshal_QueryInterface(&pStdMarshal->IMarshal_iface, riid, ppvObject);
+ if (FAILED(hr))
+ HeapFree(GetProcessHeap(), 0, pStdMarshal);
+
+ return hr;
}
/***********************************************************************
@@ -1514,8 +1520,6 @@ HRESULT WINAPI CoGetStandardMarshal(REFIID riid, IUnknown *pUnk,
DWORD dwDestContext, LPVOID pvDestContext,
DWORD mshlflags, LPMARSHAL *ppMarshal)
{
- StdMarshalImpl *dm;
-
if (pUnk == NULL)
{
FIXME("(%s,NULL,%x,%p,%x,%p), unimplemented yet.\n",
@@ -1525,17 +1529,7 @@ HRESULT WINAPI CoGetStandardMarshal(REFIID riid, IUnknown *pUnk,
TRACE("(%s,%p,%x,%p,%x,%p)\n",
debugstr_guid(riid),pUnk,dwDestContext,pvDestContext,mshlflags,ppMarshal);
- *ppMarshal = HeapAlloc(GetProcessHeap(),0,sizeof(StdMarshalImpl));
- dm = (StdMarshalImpl*) *ppMarshal;
- if (!dm) return E_FAIL;
- dm->IMarshal_iface.lpVtbl = &StdMarshalVtbl;
- dm->ref = 1;
-
- dm->iid = *riid;
- dm->dwDestContext = dwDestContext;
- dm->pvDestContext = pvDestContext;
- dm->mshlflags = mshlflags;
- return S_OK;
+ return StdMarshalImpl_Construct(&IID_IMarshal, dwDestContext, pvDestContext, (void**)ppMarshal);
}
/***********************************************************************
@@ -1592,7 +1586,7 @@ static HRESULT get_unmarshaler_from_stream(IStream *stream, IMarshal **marshal,
if (objref.flags & OBJREF_STANDARD)
{
TRACE("Using standard unmarshaling\n");
- hr = StdMarshalImpl_Construct(&IID_IMarshal, (LPVOID*)marshal);
+ hr = StdMarshalImpl_Construct(&IID_IMarshal, 0, NULL, (LPVOID*)marshal);
}
else if (objref.flags & OBJREF_CUSTOM)
{
@@ -2029,7 +2023,7 @@ static HRESULT WINAPI StdMarshalCF_CreateInstance(LPCLASSFACTORY iface,
LPUNKNOWN pUnk, REFIID riid, LPVOID *ppv)
{
if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IMarshal))
- return StdMarshalImpl_Construct(riid, ppv);
+ return StdMarshalImpl_Construct(riid, 0, NULL, ppv);
FIXME("(%s), not supported.\n",debugstr_guid(riid));
return E_NOINTERFACE;
More information about the wine-cvs
mailing list