Re: Property that sets and gets an object
"D. Cases" <dcasesbasart_@_yahoo_._es> wrote in message
news:ubP3h1ToIHA.5016@TK2MSFTNGP02.phx.gbl
The definition on the .idl file is like this:
--BEGIN CODE--
[...]
interface IContent : IDispatch{
[id(1), helpstring("method Hello")] HRESULT Hello([out,retval] BSTR*
ret); };
[...]
interface IContainer: IDispatch{
[propget, id(2), helpstring("...")] HRESULT Content([out, retval]
IContent ** cont);
[propput, id(2), helpstring("...")] HRESULT Content([in] IContent *
cont); };
(...)
--END CODE--
The CContainer class has an CContent object defined as:
--BEGIN CODE--
CComObject<CContent> * cContent;
--END CODE--
Why not store IContent* pointer? There's no guarantee that the pointer
you get in IContainer::put_Content is implemented by your CContent
class. Anybody can provide their own implementation, and your container
object promises to work with any such implementation.
I wonder how you implement put_Content.
An that I initialize in the constructor like this:
--BEGIN CODE--
cContent= new CComObject<CContent>;
--END CODE--
This creates an object with an initial reference count of zero. You
would want to AddRef it right away (and Release in the destructor),
otherwise the object is likely to be destroyed prematurely.
Don't ask about why I do this because exactly I don't have any idea. I
have copied a sample in some web.
I guess now would be a good time to try and understand what you are
doing.
Initially I defined the function get as:
--BEGIN CODE--
STDMETHODIMP IContainer::get_Content(IContent** pVal)
{
IContent* pDisp;
cContent->QueryInterface(IID_IContent, (void**)&pDisp);
ATLASSERT(pDisp);
*pVal = pDisp;
return S_OK;
}
--END CODE--
When I use the object in VB as follow I don't have any problem
--BEGIN CODE--
Dim a As ContainerLib.Container
Set a = New Container
a.Content.Hello
--END CODE--
It access to the object without any problem and executes the method
'Hello' correctly. But when I try to access by a second time to the
object all crashes at the line of the QueryInterface.
That's because the object has been destroyed, just as predicted. QI in
get_Content bumped the reference count to 1, then VB called Release when
it no longer needed the object. Ref count went down to zero, and the
object destroyed itself.
--
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