DCOM: Pass -Embedding switch to EXE servers, more tracing
Mike Hearn
mh at codeweavers.com
Wed Jul 21 18:54:40 CDT 2004
ChangeLog:
Pass -Embedding switch to EXE servers, more tracing
Index: dlls/ole32/compobj.c
===================================================================
RCS file: /home/wine/wine/dlls/ole32/compobj.c,v
retrieving revision 1.96
diff -u -p -r1.96 compobj.c
--- dlls/ole32/compobj.c 15 Jul 2004 22:07:44 -0000 1.96
+++ dlls/ole32/compobj.c 21 Jul 2004 22:43:57 -0000
@@ -903,6 +903,7 @@ HRESULT WINAPI CoGetPSClsid(
/* Open the key.. */
if (RegOpenKeyA(HKEY_CLASSES_ROOT, buf, &xhkey))
{
+ WARN("No PSFactoryBuffer object is registered for this IID\n");
HeapFree(GetProcessHeap(),0,buf);
return (E_INVALIDARG);
}
@@ -1159,12 +1160,14 @@ HRESULT WINAPI CoRegisterClassObject(
* MSDN claims that multiple interface registrations are legal, but we can't do that with
* our current implementation.
*/
+ TRACE("Checking if already registered\n");
hr = COM_GetRegisteredClassObject(rclsid, dwClsContext, &foundObject);
if (hr == S_OK) {
IUnknown_Release(foundObject);
return CO_E_OBJISREG;
}
+ TRACE("allocating new class\n");
newClass = HeapAlloc(GetProcessHeap(), 0, sizeof(RegisteredClass));
if ( newClass == NULL )
return E_OUTOFMEMORY;
@@ -1185,12 +1188,14 @@ HRESULT WINAPI CoRegisterClassObject(
* Since we're making a copy of the object pointer, we have to increase its
* reference count.
*/
+ TRACE("Reffing\n");
newClass->classObject = pUnk;
IUnknown_AddRef(newClass->classObject);
firstRegisteredClass = newClass;
LeaveCriticalSection( &csRegisteredClassList );
+ TRACE("Setting cookie\n");
*lpdwRegister = newClass->dwCookie;
if (dwClsContext & CLSCTX_LOCAL_SERVER) {
@@ -1352,7 +1357,7 @@ HRESULT WINAPI CoGetClassObject(
if ( compobj_RegReadPath(keyname, NULL, dllpath, sizeof(dllpath)) != ERROR_SUCCESS) {
/* failure: CLSID is not found in registry */
- WARN("class %s not registred\n", xclsid);
+ WARN("class %s not registered inproc\n", xclsid);
hres = REGDB_E_CLASSNOTREG;
} else {
if ((hLibrary = LoadLibraryExA(dllpath, 0, LOAD_WITH_ALTERED_SEARCH_PATH)) == 0) {
Index: dlls/ole32/marshal.c
===================================================================
RCS file: /home/wine/wine/dlls/ole32/marshal.c,v
retrieving revision 1.20
diff -u -p -r1.20 marshal.c
--- dlls/ole32/marshal.c 30 Jun 2004 18:14:00 -0000 1.20
+++ dlls/ole32/marshal.c 21 Jul 2004 22:43:58 -0000
@@ -256,6 +256,7 @@ StdMarshalImpl_MarshalInterface(
IPSFactoryBuffer *psfacbuf;
TRACE("(...,%s,...)\n",debugstr_guid(riid));
+
IUnknown_QueryInterface((LPUNKNOWN)pv,&IID_IUnknown,(LPVOID*)&pUnk);
mid.processid = GetCurrentProcessId();
mid.objectid = (DWORD)pUnk; /* FIXME */
@@ -272,17 +273,24 @@ StdMarshalImpl_MarshalInterface(
IUnknown_Release(pUnk);
return S_OK;
}
+
hres = get_facbuf_for_iid(riid,&psfacbuf);
- if (hres) return hres;
+ if (hres) {
+ WARN("failed to get PSFactoryBuffer for IID %s\n", debugstr_guid(riid));
+ return hres;
+ }
+
hres = IPSFactoryBuffer_CreateStub(psfacbuf,riid,pv,&stub);
IPSFactoryBuffer_Release(psfacbuf);
if (hres) {
FIXME("Failed to create a stub for %s\n",debugstr_guid(riid));
return hres;
}
+
IUnknown_QueryInterface((LPUNKNOWN)pv,riid,(LPVOID*)&pUnk);
MARSHAL_Register_Stub(&mid,pUnk,stub);
IUnknown_Release(pUnk);
+
return S_OK;
}
@@ -484,7 +492,10 @@ CoMarshalInterface( IStream *pStm, REFII
FIXME("Stream write failed, %lx\n",hres);
goto release_marshal;
}
+
+ TRACE("Calling IMarshal::MarshalInterace\n");
hres = IMarshal_MarshalInterface(pMarshal,pStm,riid,pUnk,dwDestContext,pvDestContext,mshlflags);
+
if (hres) {
if (IsEqualGUID(riid,&IID_IOleObject)) {
ERR("WINE currently cannot marshal IOleObject interfaces. This means you cannot embed/link OLE objects between applications.\n");
Index: dlls/ole32/rpc.c
===================================================================
RCS file: /home/wine/wine/dlls/ole32/rpc.c,v
retrieving revision 1.15
diff -u -p -r1.15 rpc.c
--- dlls/ole32/rpc.c 15 Jul 2004 22:07:44 -0000 1.15
+++ dlls/ole32/rpc.c 21 Jul 2004 22:43:59 -0000
@@ -471,8 +471,10 @@ create_server(REFCLSID rclsid) {
char buf[200];
HRESULT hres = E_UNEXPECTED;
char xclsid[80];
- WCHAR dllName[MAX_PATH+1];
- DWORD dllNameLen = sizeof(dllName);
+ WCHAR exe[MAX_PATH+1];
+ DWORD exelen = sizeof(exe);
+ static const WCHAR embedding[] = { ' ', '-','E','m','b','e','d','d','i','n','g',0 };
+ WCHAR command[MAX_PATH+sizeof(embedding)+1];
STARTUPINFOW sinfo;
PROCESS_INFORMATION pinfo;
@@ -481,18 +483,35 @@ create_server(REFCLSID rclsid) {
sprintf(buf,"CLSID\\%s\\LocalServer32",xclsid);
hres = RegOpenKeyExA(HKEY_CLASSES_ROOT, buf, 0, KEY_READ, &key);
- if (hres != ERROR_SUCCESS)
+ if (hres != ERROR_SUCCESS) {
+ WARN("CLSID %s not registered as LocalServer32\n", xclsid);
return REGDB_E_READREGDB; /* Probably */
+ }
- memset(dllName,0,sizeof(dllName));
- hres= RegQueryValueExW(key,NULL,NULL,NULL,(LPBYTE)dllName,&dllNameLen);
+ memset(exe,0,sizeof(exe));
+ hres= RegQueryValueExW(key, NULL, NULL, NULL, (LPBYTE)exe, &exelen);
RegCloseKey(key);
- if (hres)
- return REGDB_E_CLASSNOTREG; /* FIXME: check retval */
+ if (hres) {
+ WARN("No default value for LocalServer32 key\n");
+ return REGDB_E_CLASSNOTREG; /* FIXME: check retval */
+ }
+
memset(&sinfo,0,sizeof(sinfo));
sinfo.cb = sizeof(sinfo);
- if (!CreateProcessW(NULL,dllName,NULL,NULL,FALSE,0,NULL,NULL,&sinfo,&pinfo))
+
+ /* EXE servers are started with the -Embedding switch. MSDN also claims /Embedding is used,
+ 9x does -Embedding, perhaps an 9x/NT difference? */
+
+ strcpyW(command, exe);
+ strcatW(command, embedding);
+
+ TRACE("activating local server '%s' for %s\n", debugstr_w(command), xclsid);
+
+ if (!CreateProcessW(exe, command, NULL, NULL, FALSE, 0, NULL, NULL, &sinfo, &pinfo)) {
+ WARN("failed to run local server %s\n", debugstr_w(exe));
return E_FAIL;
+ }
+
return S_OK;
}
/* http://msdn.microsoft.com/library/en-us/dnmsj99/html/com0199.asp, Figure 4 */
@@ -508,6 +527,8 @@ HRESULT create_marshalled_proxy(REFCLSID
int tries = 0;
#define MAXTRIES 10000
+ TRACE("rclsid=%s, iid=%s\n", debugstr_guid(rclsid), debugstr_guid(iid));
+
strcpy(pipefn,PIPEPREF);
WINE_StringFromCLSID(rclsid,pipefn+strlen(PIPEPREF));
More information about the wine-patches
mailing list