I'm trying to force an existing native C++ ATL in-proc COM server into a separate process. I hope DCOM can do this for me without changing the COM server.
I started with a usual registry setup - I have a HKCR\CLSID{classId} entry and an InProcServer32 key there specifying the path to the .dll file.
I generated an application id (GUID) and added it here and there. Specifically I added a string value "AppId" under HKCR\CLSID{classId} equal to the application id. I also added a HKCR\AppId{applicationId} key and a string value "DllSurrogate" equal to an empty string. I thought it would be enough for forcing my COM server into a default system-provided surrogate.
The DCOM application appears in the DCOM configuration console. However when I call CoCreateInstance()
or CoGetClassObject()
and provide the class id and CLSCTX_LOCAL_SERVER
it returns "Class not registered". What am I doing wrong?
UPD: Resolved. The steps taken were enough to make it work except that I was editing the registry for the wrong class id that for some reason had the same path under InProcServer32 key - perhaps that was a COM hell issue.
Isn't this what DLLHOST.EXE was made for?
wrong registry key. you need to set LocalServer32, not InProcServer32 in HKCR\CLSID{classId}.
However, windows cannot instantiate a DLL. So you need to change your program into a full COM server exe. Windows will start your EXE and send in the argument /embedding. You can then create the CComModule and start your program.
Follow the check list:
CLSCTX_LOCAL_SERVER
bit is set and the CLSID key does not specify LocalServer32, LocalServer, or LocalService. (checked)