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