On 09.08.2017 20:12, Zebediah Figura wrote:
On 08/09/2017 06:07 AM, Jacek Caban wrote:
Hi Zebediah,

On 08.08.2017 20:04, Zebediah Figura wrote:
  HRESULT register_class_object(BOOL do_reg)
  {
      HRESULT hres;
  -    static DWORD cookie;
+    static DWORD ie_cookie, iem_cookie;
        if(do_reg) {
          hres = CoRegisterClassObject(&CLSID_InternetExplorer,
                  (IUnknown*)&InternetExplorerFactory, CLSCTX_SERVER,
-                REGCLS_MULTIPLEUSE|REGCLS_SUSPENDED, &cookie);
-        if (FAILED(hres)) {
+                REGCLS_MULTIPLEUSE, &ie_cookie);
+        if (FAILED(hres))
+            ERR("failed to register object %08x\n", hres);
+        hres = CoRegisterClassObject(&CLSID_InternetExplorerManager,
+                (IUnknown*)&InternetExplorerManagerFactory, CLSCTX_SERVER,
+                REGCLS_MULTIPLEUSE, &iem_cookie);
+        if (FAILED(hres))
              ERR("failed to register object %08x\n", hres);
-            return hres;
-        }
-
-        hres = CoResumeClassObjects();
-        if(SUCCEEDED(hres))
-            return hres;
-
-        ERR("failed to resume object %08x\n", hres);
      }
-
-    return CoRevokeClassObject(cookie);
+    else
+    {
+        hres = CoRevokeClassObject(ie_cookie);
+        if (FAILED(hres))
+            ERR("failed to register object %08x\n", hres);
+        hres = CoRevokeClassObject(iem_cookie);
+        if (FAILED(hres))
+            ERR("failed to register object %08x\n", hres);
+    }
+    return hres;
  }

Are you sure that's how it's supposed to work? I didn't test it myself, but given how it's registered and documented, I'd expect that CLSID_InternetExplorerManager should live in a different process from CLSID_InternetExplorer. It should be easy to distinguish those processes with -startmanager command line argument.


I'm sorry, I don't understand what you mean. Isn't CoRegisterClassObject process-agnostic?


It is in a sense that created proxy/stub abstract where the object lives, yes. But note that the actual instance of IE object must live in one process or another. There is a lot of different aspects like pluggable protocols, script engines, ActiveX objects, document objects that live in its process and it's quite important for them which process it is. I did a bit of testing and it seems to be a separated process on Windows, so we should follow that.


Jacek