Re: How to force creation of COM object through method call
Matt Houser <MattHouser@discussions.microsoft.com> wrote:
I have 2 ATL COM objects:
1. CObject1 implements IObject1
2. CObject2 implements IObject2
I don't want consumers of the classes to be able to create a CObject1
directly. Instead, I want them to use IObject2::CreateObject1() to
create the object.
1. How do I hide a COM object from being created external to my ATL
library?
Don't derive it from CComCoClass, don't write a coclass statement for it
in the IDL, don't list it in OBJECT_ENTRY[_AUTO]. This way it doesn't
have a CLSID associated with it.
2. When I do create my object internally, do I create a CObject1 and
return it, or do I do CoCreateInstance() and return that?
The usual pattern goes like this:
STDMETHODIMP CObject2::CreateObject1(IObject1** pp) {
if (!pp) return E_POINTER;
*pp = NULL;
CComObject<CObject1>* pObj = NULL;
HRESULT hr = CComObject<CObject1>::CreateInstance(&pObj);
if (pObj) {
pObj->AddRef();
// any initialization you may need to perform;
// the name "Init" is for exposition only.
pObj->Init();
hr = pObj->QueryInterface(pp);
pObj->Release();
}
return hr;
}
--
With best wishes,
Igor Tandetnik
With sufficient thrust, pigs fly just fine. However, this is not
necessarily a good idea. It is hard to be sure where they are going to
land, and it could be dangerous sitting under them as they fly
overhead. -- RFC 1925