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 have a static XML schema that I'm trying to represent in a COM
object. So, if the XML looks like this:
<TagA value="X" Name="Y">
<TagB Name="Z" something="xyz">
<TagC Value="Ugly" phone="on" brain="off">
<TagC Value="Poor" phone="on" brain="mush">
<TagC Value="Target" phone="on" brain="Jello">
<TagC Value="Clue" phone="off" brain="on">
<TagB>
</TagA>
I'd have COM objects like:
class CTagB : public CComObjectRootEx<>,
public CComCoClass<>,
public IDispatchImpl< CollectionType,...>
{
BEGIN_COM_MAP( CTagB )
COM_INTERFACE_ENTRY( ITagB )
COM_INTERFACE_ENTRY( IDispatch )
END_COM_MAP()
DECLARE_NO_REGISTRY()
DECLARE_NOT_AGGREGATABLE( CTagB )
DECLARE_GET_CONTROLLING_UNKNOWN()
DECLARE_PROTECT_FINAL_CONSTRUCT()
HRESULT FinalConstruct();
void SetParent( ITagA* pParent );
STDMETHOD( get_Parent )( ITagA** ppParent );
STDMETHOD( get_Root )( ITagA** ppRoot );
STDMETHOD( Add )( ITagC* pPackage );
STDMETHOD( Remove )( long Index );
STDMETHOD( Clear )( void );
STDMETHOD( CreatePackage )( IPackage** ppPackage );
friend MSXML2::IXMLDOMNodePtr operator <<
( MSXML2::IXMLDOMNodePtr node, const CTagB& osf );
friend MSXML2::IXMLDOMNodePtr operator >>( const
MSXML2::IXMLDOMNodePtr node, CTagC& osf );
protected:
ITagA* pParent_;
};
The CComObjectRoot<> static object hierarchy seemed to be a good way
to go. But, the problem is that I don't know how many <TagC/> elements
there will be. So CTagB has to be a collection. I could make it a
collection of ITagC*, but then I can't use the operator<<() to print
and set the XML behind the scenes as I could if it were a collection
of CTagC objects.
Also, every other object is created by doing something like:
TagBPtr pTagBPtr = pTagAPtr->GetTagB();
But, TagC would have to be created by:
TagCPtr pTagCPtr( CLSID_TagC );
which seems inconsistent.
What do you suggest?
Thanks,
PaulH