oleaut32.CreateStdDispatch implementation
Robert Shearman
R.J.Shearman at warwick.ac.uk
Sat Dec 14 13:42:40 CST 2002
This patch allows me to use MSN Messenger now with ole32=b and oleaut32=b
ChangeLog:
- Add standard dispatch implementation (CreateStdDispatch)
-------------- next part --------------
Index: dispatch.c
===================================================================
RCS file: /home/wine/wine/dlls/oleaut32/dispatch.c,v
retrieving revision 1.9
diff -u -r1.9 dispatch.c
--- dispatch.c 12 Dec 2002 22:24:45 -0000 1.9
+++ dispatch.c 14 Dec 2002 19:25:26 -0000
@@ -39,6 +39,7 @@
WINE_DEFAULT_DEBUG_CHANNEL(ole);
WINE_DECLARE_DEBUG_CHANNEL(typelib);
+static IDispatch * WINAPI StdDispatch_Construct(IUnknown * punkOuter, void * pvThis, ITypeInfo * pTypeInfo);
/******************************************************************************
* DispInvoke (OLEAUT32.30)
@@ -164,9 +165,12 @@
ITypeInfo* ptinfo,
IUnknown** ppunkStdDisp)
{
- FIXME("(%p,%p,%p,%p),stub\n",punkOuter, pvThis, ptinfo,
- ppunkStdDisp);
- return E_NOTIMPL;
+ TRACE("(%p, %p, %p, %p)\n", punkOuter, pvThis, ptinfo, ppunkStdDisp);
+
+ *ppunkStdDisp = (LPUNKNOWN)StdDispatch_Construct(punkOuter, pvThis, ptinfo);
+ if (!*ppunkStdDisp)
+ return E_OUTOFMEMORY;
+ return S_OK;
}
/******************************************************************************
@@ -179,4 +183,141 @@
{
FIXME("(%p,%ld,%p),stub\n",pidata,lcid,pptinfo);
return 0;
+}
+
+typedef struct
+{
+ ICOM_VFIELD(IDispatch);
+ IUnknown * outerUnknown;
+ void * pvThis;
+ ITypeInfo * pTypeInfo;
+ ULONG ref;
+} StdDispatch;
+
+static HRESULT WINAPI StdDispatch_QueryInterface(
+ LPDISPATCH iface,
+ REFIID riid,
+ void** ppvObject)
+{
+ ICOM_THIS(StdDispatch, iface);
+ TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), ppvObject);
+
+ if (This->outerUnknown)
+ return IUnknown_QueryInterface(This->outerUnknown, riid, ppvObject);
+
+ if (IsEqualIID(riid, &IID_IDispatch) ||
+ IsEqualIID(riid, &IID_IUnknown))
+ {
+ *ppvObject = (LPVOID)This;
+ IUnknown_AddRef((LPUNKNOWN)*ppvObject);
+ return S_OK;
+ }
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI StdDispatch_AddRef(LPDISPATCH iface)
+{
+ ICOM_THIS(StdDispatch, iface);
+ TRACE("()\n");
+ This->ref++;
+ if (This->outerUnknown)
+ return IUnknown_AddRef(This->outerUnknown);
+ else
+ return This->ref;
+}
+
+static ULONG WINAPI StdDispatch_Release(LPDISPATCH iface)
+{
+ ICOM_THIS(StdDispatch, iface);
+ ULONG ret;
+ TRACE("(%p)->()\n", This);
+
+ This->ref--;
+
+ if (This->outerUnknown)
+ ret = IUnknown_Release(This->outerUnknown);
+ else
+ ret = This->ref;
+
+ if (This->ref <= 0)
+ CoTaskMemFree(This);
+
+ return ret;
+}
+
+static HRESULT WINAPI StdDispatch_GetTypeInfoCount(LPDISPATCH iface, UINT * pctinfo)
+{
+ TRACE("(%p)\n", pctinfo);
+
+ *pctinfo = 1;
+ return S_OK;
+}
+
+static HRESULT WINAPI StdDispatch_GetTypeInfo(LPDISPATCH iface, UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo)
+{
+ ICOM_THIS(StdDispatch, iface);
+ TRACE("(%d, %lx, %p)\n", iTInfo, lcid, ppTInfo);
+
+ if (iTInfo != 0)
+ return DISP_E_BADINDEX;
+ *ppTInfo = This->pTypeInfo;
+ return S_OK;
+}
+
+static HRESULT WINAPI StdDispatch_GetIDsOfNames(LPDISPATCH iface, REFIID riid, LPOLESTR * rgszNames, UINT cNames, LCID lcid, DISPID * rgDispId)
+{
+ ICOM_THIS(StdDispatch, iface);
+ TRACE("(%s, %p, %d, 0x%lx, %p)\n", debugstr_guid(riid), rgszNames, cNames, lcid, rgDispId);
+
+ if (!IsEqualGUID(riid, &IID_NULL))
+ {
+ FIXME(" expected riid == IID_NULL\n");
+ return E_INVALIDARG;
+ }
+ return DispGetIDsOfNames(This->pTypeInfo, rgszNames, cNames, rgDispId);
+}
+
+static HRESULT WINAPI StdDispatch_Invoke(LPDISPATCH iface, DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS * pDispParams, VARIANT * pVarResult, EXCEPINFO * pExcepInfo, UINT * puArgErr)
+{
+ ICOM_THIS(StdDispatch, iface);
+ TRACE("(%ld, %s, 0x%lx, 0x%x, %p, %p, %p, %p)\n", dispIdMember, debugstr_guid(riid), lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
+
+ if (!IsEqualGUID(riid, &IID_NULL))
+ {
+ FIXME(" expected riid == IID_NULL\n");
+ return E_INVALIDARG;
+ }
+ return DispInvoke(This->pvThis, This->pTypeInfo, dispIdMember, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
+}
+
+static ICOM_VTABLE(IDispatch) StdDispatch_VTable =
+{
+ ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+ StdDispatch_QueryInterface,
+ StdDispatch_AddRef,
+ StdDispatch_Release,
+ StdDispatch_GetTypeInfoCount,
+ StdDispatch_GetTypeInfo,
+ StdDispatch_GetIDsOfNames,
+ StdDispatch_Invoke
+};
+
+static IDispatch * WINAPI StdDispatch_Construct(
+ IUnknown * punkOuter,
+ void * pvThis,
+ ITypeInfo * pTypeInfo)
+{
+ StdDispatch * pStdDispatch;
+
+ pStdDispatch = CoTaskMemAlloc(sizeof(StdDispatch));
+ if (!pStdDispatch)
+ return (IDispatch *)pStdDispatch;
+
+ pStdDispatch->lpVtbl = &StdDispatch_VTable;
+ pStdDispatch->outerUnknown = punkOuter;
+ pStdDispatch->pvThis = pvThis;
+ pStdDispatch->pTypeInfo = pTypeInfo;
+ pStdDispatch->ref = 1;
+
+ return (IDispatch *)pStdDispatch;
}
More information about the wine-patches
mailing list