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