Can I create and use a COM class without registering it in the registry?

风流意气都作罢 提交于 2019-12-01 02:14:01

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 an IClassFactory object that can construct it:

private class ClientCommunicatorFactory : ComObject, IClassFactory
{
   //IClassFactory methods
   HRESULT CreateInstance(IUnknown unkOuter, Guid iid, out obj)
   {
      ClientCommunicator cc = new CClientCommunicator();

      HRESULT hr = cc.QueryInterface(iid, out obj);
      return hr;
   }
}

You now have:

  • your CLSID_ClientCommunicator
  • your IClassFactory that can construct it

You register the two with COM using CoRegisterClassObject:

IClassFactory factory = new ClientCommunicatorFactory();
DWORD dwCookie; //cookie to keep track of our registration

CoRegisterClassObject(
   CLSID_ClientCommunicator,  // the CLSID to register
   factory,                   // the factory that can construct the object
   CLSCTX_INPROC_SERVER,      // can only be used inside our process
   REGCLS_MULTIPLEUSE,        // it can be created multiple times
   out dwCookie               // cookie we can later use to delete the registration
);

So now, if someone in your process tries to construct your class:

IUnknown cc = CreateComObject(CLSID_ClientCommunicator);

it will just work; even though the class is not registered in the registry.

Bonus

IUnknown CreateComObject(Guid clsid)
{
   IUnknown unk;
   HRESULT hr = CoCreateInstance(clsid, null, CLSCTX_INPROC_SERVER, IID_IUnknown, out unk);
   if (Failed(hr))
      throw new EComException(hr);

   return unk;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!