I need to make a custom COM object that is going to end up looking similar to this:
static const GUID IID_ClientCommunicator = { 0x5219b44a, 0x874, 0x449e,{ 0x86, 0x11, 0xb7, 0x8, 0xd, 0xbf, 0xa6, 0xab } };
static const GUID CLSID_ClientCommunicator = { 0x5219b44b, 0x874, 0x449e,{ 0x86, 0x11, 0xb7, 0x8, 0xd, 0xbf, 0xa6, 0xab } };
class ATL_NO_VTABLE CClientCommunicator:
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CClientCommunicator, &CLSID_ClientCommunicator>,
public IDispatchImpl<CClientCommunicator, &IID_ClientCommunicator, 0, /*wMajor =*/ 1, /*wMinor =*/ 0>
{
public:
//Custom functions
};
This object is going to end up being passed as a property to the window javascript object in internet explorer so that I can call the functions I define in this class from JavaScript.
My question is, if this is all done in a single executable, do I need to register the COM object in the Registry? If yes, how do I do that if my COM object is in an executable?
As user @RaymondChen pointed out in the comments there is a function
CoRegisterClassObject
here, which can be used to register COM classes without needed to add them to the registry.This of course only allows you to use that COM class in the scope of the executable which registered it.
It is the job of an object that implements
IClassFactory
to construct the class.You already have your
CLSID_ClientCommunicator
. Now you just need to supply anIClassFactory
object that can construct it:You now have:
CLSID_ClientCommunicator
IClassFactory
that can construct itYou register the two with COM using
CoRegisterClassObject
:So now, if someone in your process tries to construct your class:
it will just work; even though the class is not registered in the registry.
Bonus