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