wine/dlls/oleaut32 oleaut.c
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Nov 2 04:54:52 CST 2005
ChangeSet ID: 21030
CVSROOT: /opt/cvs-commit
Module name: wine
Changes by: julliard at winehq.org 2005/11/02 04:54:52
Modified files:
dlls/oleaut32 : oleaut.c
Log message:
Robert Shearman <rob at codeweavers.com>
The PSDispatch PS class factory can manage both typelib marshalled and
IDispatch, which is NDR marshalled, so we need a wrapper to call the
appropriate CreateProxy or CreateStub function.
Patch: http://cvs.winehq.org/patch.py?id=21030
Old revision New revision Changes Path
1.53 1.54 +76 -2 wine/dlls/oleaut32/oleaut.c
Index: wine/dlls/oleaut32/oleaut.c
diff -u -p wine/dlls/oleaut32/oleaut.c:1.53 wine/dlls/oleaut32/oleaut.c:1.54
--- wine/dlls/oleaut32/oleaut.c:1.53 2 Nov 2005 10:54:52 -0000
+++ wine/dlls/oleaut32/oleaut.c 2 Nov 2005 10:54:52 -0000
@@ -699,6 +699,76 @@ extern HRESULT OLEAUTPS_DllGetClassObjec
extern void _get_STDFONT_CF(LPVOID);
extern void _get_STDPIC_CF(LPVOID);
+static HRESULT WINAPI PSDispatchFacBuf_QueryInterface(IPSFactoryBuffer *iface, REFIID riid, void **ppv)
+{
+ if (IsEqualIID(riid, &IID_IUnknown) ||
+ IsEqualIID(riid, &IID_IPSFactoryBuffer))
+ {
+ IUnknown_AddRef(iface);
+ *ppv = (void *)iface;
+ return S_OK;
+ }
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI PSDispatchFacBuf_AddRef(IPSFactoryBuffer *iface)
+{
+ return 2;
+}
+
+static ULONG WINAPI PSDispatchFacBuf_Release(IPSFactoryBuffer *iface)
+{
+ return 1;
+}
+
+static HRESULT WINAPI PSDispatchFacBuf_CreateProxy(IPSFactoryBuffer *iface, IUnknown *pUnkOuter, REFIID riid, IRpcProxyBuffer **ppProxy, void **ppv)
+{
+ IPSFactoryBuffer *pPSFB;
+ HRESULT hr;
+
+ if (IsEqualIID(riid, &IID_IDispatch))
+ hr = OLEAUTPS_DllGetClassObject(&CLSID_PSDispatch, &IID_IPSFactoryBuffer, (void **)&pPSFB);
+ else
+ hr = TMARSHAL_DllGetClassObject(&CLSID_PSOAInterface, &IID_IPSFactoryBuffer, (void **)&pPSFB);
+
+ if (FAILED(hr)) return hr;
+
+ hr = IPSFactoryBuffer_CreateProxy(pPSFB, pUnkOuter, riid, ppProxy, ppv);
+
+ IPSFactoryBuffer_Release(pPSFB);
+ return hr;
+}
+
+static HRESULT WINAPI PSDispatchFacBuf_CreateStub(IPSFactoryBuffer *iface, REFIID riid, IUnknown *pUnkOuter, IRpcStubBuffer **ppStub)
+{
+ IPSFactoryBuffer *pPSFB;
+ HRESULT hr;
+
+ if (IsEqualIID(riid, &IID_IDispatch))
+ hr = OLEAUTPS_DllGetClassObject(&CLSID_PSDispatch, &IID_IPSFactoryBuffer, (void **)&pPSFB);
+ else
+ hr = TMARSHAL_DllGetClassObject(&CLSID_PSOAInterface, &IID_IPSFactoryBuffer, (void **)&pPSFB);
+
+ if (FAILED(hr)) return hr;
+
+ hr = IPSFactoryBuffer_CreateStub(pPSFB, riid, pUnkOuter, ppStub);
+
+ IPSFactoryBuffer_Release(pPSFB);
+ return hr;
+}
+
+static const IPSFactoryBufferVtbl PSDispatchFacBuf_Vtbl =
+{
+ PSDispatchFacBuf_QueryInterface,
+ PSDispatchFacBuf_AddRef,
+ PSDispatchFacBuf_Release,
+ PSDispatchFacBuf_CreateProxy,
+ PSDispatchFacBuf_CreateStub
+};
+
+/* This is the whole PSFactoryBuffer object, just the vtableptr */
+static const IPSFactoryBufferVtbl *pPSDispatchFacBuf = &PSDispatchFacBuf_Vtbl;
+
/***********************************************************************
* DllGetClassObject (OLEAUT32.@)
*/
@@ -719,12 +789,16 @@ HRESULT WINAPI DllGetClassObject(REFCLSI
return S_OK;
}
}
- if (IsEqualCLSID(rclsid, &CLSID_PSDispatch) ||
- IsEqualCLSID(rclsid, &CLSID_PSTypeInfo) ||
+ if (IsEqualCLSID(rclsid, &CLSID_PSTypeInfo) ||
IsEqualCLSID(rclsid, &CLSID_PSTypeLib) ||
IsEqualCLSID(rclsid, &CLSID_PSEnumVariant)) {
return OLEAUTPS_DllGetClassObject(&CLSID_PSDispatch, iid, ppv);
}
+ if (IsEqualCLSID(rclsid, &CLSID_PSDispatch) && IsEqualIID(iid, &IID_IPSFactoryBuffer)) {
+ *ppv = &pPSDispatchFacBuf;
+ IPSFactoryBuffer_AddRef((IPSFactoryBuffer *)*ppv);
+ return S_OK;
+ }
if (IsEqualGUID(rclsid,&CLSID_PSOAInterface)) {
if (S_OK==TMARSHAL_DllGetClassObject(rclsid,iid,ppv))
return S_OK;
More information about the wine-cvs
mailing list