Re: copy from IUnknown* to CComObjectRoot
On Feb 26, 6:43 pm, "Igor Tandetnik" <itandet...@mvps.org> wrote:
PaulH <paul.h...@gmail.com> wrote:
I have an ATL COM object that implements an ATL collection of another
ATL COM object. What I would like to do is essentially what I have in
the code below, I'm just not sure how to implement it. As is, the code
compiles, but when I read the iterator back, the collection is full of
empty objects suggesting the copy isn't deep enough.
typedef std::vector< CComObjectEmbed< CMyObj > > ContainerType;
STDMETHODIMP CMyCollection::Add( IMyObj* pObj )
{
CComObjectEmbed< CMyObj > item;
item = pObj; // ???
This compiles because CComObjectEmbed has this constructor:
CComObjectEmbed(void* pv) {m_pOuterUnknown = (IUnknown*)pv;}
As you see, what it does is nowhere near what you seem to think it does.
I'm not sure what you are trying to achieve. Why not just have a
collection of IMyObj* pointers? Note that there's no guarantee that
there's an instance of CMyObj behing IMyObj*. Somebody could provide
their own implementation of IMyObj, and pass that to you.
--
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
I think I've got it figured out. Copying isn't the answer. "Jason S"
had the same problem a couple of years ago:
http://groups.google.com/group/microsoft.public.vc.atl/browse_frm/thread/84=
ee44bdf4eed6f1?q=Re:+object+hierarchy,+parent-child+links,+etc#a8a19c5107=
8cd2a8
Feel free to tell me if this is a bad idea, but I went with:
typedef std::vector< CComObjectEmbed< CPackage > > ContainerType;
STDMETHODIMP CTagB::CreateTagC( ITagC** ppTagC )
{
CComObjectEmbed< CTagC > tagc;
tagc.SetParent( this );
tagc.SetOuterUnknown( GetControllingUnknown() );
HRESULT hrTagC = tagc.FinalConstruct();
if( FAILED( hrTagC ) )
return hrTagC ;
m_coll.push_back( tagc);
return m_coll.rbegin()->QueryInterface( ppTagC );
}
So, when you create a TagC, it's automatically added to TagB.
-PaulH