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