PATCH: IUnknown / DCOM
Marcus Meissner
Marcus.Meissner at caldera.de
Tue Jun 4 16:13:43 CDT 2002
Hi,
This adds IUnknown marshalling. Not 100% sure it is correct this way.
Ciao, Marcus
License: LGPL
Changelog:
Added Marshalling of IUnknown.
Index: winedefault.reg
===================================================================
RCS file: /home/wine/wine/winedefault.reg,v
retrieving revision 1.47
diff -u -r1.47 winedefault.reg
--- winedefault.reg 22 May 2002 21:32:49 -0000 1.47
+++ winedefault.reg 2 Jun 2002 15:07:37 -0000
@@ -129,6 +129,9 @@
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Interface\{00000000-0000-0000-C000-000000000046}\NumMethods]
@="3"
+[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Interface\{00000000-0000-0000-C000-000000000046}\ProxyStubClsid32]
+@="{00000320-0000-0000-C000-000000000046}"
+
# IClassFactory, standard interface for creating instances of classes.
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Interface\{00000001-0000-0000-C000-000000000046}]
@="IClassFactory"
Index: dlls/ole32/oleproxy.c
===================================================================
RCS file: /home/wine/wine/dlls/ole32/oleproxy.c,v
retrieving revision 1.3
diff -u -r1.3 oleproxy.c
--- dlls/ole32/oleproxy.c 31 May 2002 23:25:50 -0000 1.3
+++ dlls/ole32/oleproxy.c 2 Jun 2002 15:07:37 -0000
@@ -452,7 +452,9 @@
LPPSFACTORYBUFFER iface, IUnknown* pUnkOuter, REFIID riid,
IRpcProxyBuffer **ppProxy, LPVOID *ppv
) {
- if (IsEqualIID(&IID_IClassFactory,riid))
+ if (IsEqualIID(&IID_IClassFactory,riid) ||
+ IsEqualIID(&IID_IUnknown,riid)
+ )
return CFProxy_Construct(ppv,(LPVOID*)ppProxy);
FIXME("proxying not implemented for (%s) yet!\n",debugstr_guid(riid));
return E_FAIL;
@@ -467,7 +469,9 @@
TRACE("(%s,%p,%p)\n",debugstr_guid(riid),pUnkServer,ppStub);
- if (IsEqualIID(&IID_IClassFactory,riid)) {
+ if (IsEqualIID(&IID_IClassFactory,riid) ||
+ IsEqualIID(&IID_IUnknown,riid)
+ ) {
hres = CFStub_Construct(ppStub);
if (!hres)
IRpcStubBuffer_Connect((*ppStub),pUnkServer);
@@ -503,7 +507,11 @@
STUBMGR_Start();
return S_OK;
}
- if (IsEqualIID(rclsid,&CLSID_DfMarshal)&&IsEqualIID(iid,&IID_IClassFactory))
+ if (IsEqualIID(rclsid,&CLSID_DfMarshal)&&(
+ IsEqualIID(iid,&IID_IClassFactory) ||
+ IsEqualIID(iid,&IID_IUnknown)
+ )
+ )
return MARSHAL_GetStandardMarshalCF(ppv);
FIXME("\n\tCLSID:\t%s,\n\tIID:\t%s\n",debugstr_guid(rclsid),debugstr_guid(iid));
return CLASS_E_CLASSNOTAVAILABLE;
Index: dlls/oleaut32/tmarshal.c
===================================================================
RCS file: /home/wine/wine/dlls/oleaut32/tmarshal.c,v
retrieving revision 1.4
diff -u -r1.4 tmarshal.c
--- dlls/oleaut32/tmarshal.c 31 May 2002 23:25:50 -0000 1.4
+++ dlls/oleaut32/tmarshal.c 2 Jun 2002 15:07:38 -0000
@@ -436,6 +436,8 @@
ITypeInfo_Release(tinfo2);
return hres;
}
+ case VT_UNKNOWN:
+ return _marshal_interface(buf,&IID_IUnknown,(LPUNKNOWN)*arg);
default:
ERR("Cannot marshal type %d\n",tdesc->vt);
/*dump_ELEMDESC(elem);*/
@@ -887,7 +889,10 @@
case VT_UNKNOWN:
/* FIXME: UNKNOWN is unknown ..., but allocate 4 byte for it */
*arg=(DWORD)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(DWORD));
- return S_OK;
+ hres = S_OK;
+ if (elem->u.paramdesc.wParamFlags & PARAMFLAG_FIN)
+ hres = _unmarshal_interface(buf,&IID_IUnknown,(LPUNKNOWN*)arg);
+ return hres;
case VT_VOID:
*arg = (DWORD)HeapAlloc(GetProcessHeap(),0,sizeof(LPVOID));
hres = S_OK;
@@ -993,7 +998,7 @@
case VT_UNKNOWN:
if (elem->u.paramdesc.wParamFlags & PARAMFLAG_FOUT) {
FIXME("Marshaling back VT_UNKNOWN %lx\n",*arg);
- hres = xbuf_add(buf,(LPBYTE)*arg,sizeof(DWORD));
+ hres = _marshal_interface(buf,&IID_IUnknown,(LPUNKNOWN)*arg);
}
HeapFree(GetProcessHeap(),0,(LPVOID)*arg);
return hres;
More information about the wine-patches
mailing list