Re: Passing a COM object from another type library?
zilbopnebobabop@gmail.com wrote:
I have two separate ATL/COM DLLs, X and Y. I want one of the objects
defined in Y to be able to be passed a certain object from X. I am
#importing X's typelib into Y so that I can use X's objects in Y.
I couldn't figure out how to modify Y's IDL to allow this directly
Just import "x.idl" outside library block, and importlib("x.tlb")
inside. Then use IXClass* as needed.
And that it's really the type that I want:
XLib::IXClassPtr *xObj = NULL;
IXClassPtr is a smart pointer. It wraps IXClass*. IXClassPtr* is
roughly equivalent to IXClass** (note double indirection). You want
simply
XLib::IXClassPtr xObj;
Further, note that, being a smart pointer, IXClassPtr's constructor and
assignment operator perform QueryInterface automatically. You can simply
say
m_XObj = newVal.punkVal;
if (!m_XObj) { /* doesn't support our interface */ };
Is there an easy way to do it the way I originally wanted, instead?
That is, to just define it directly in the IDL, instead of relying on
a VARIANT?
Yes.
Is the check for "VT_UNKNOWN or VT_DISPATCH" sufficient, or is there
some other possibility I have to check for?
VT_NULL, if it is valid to pass a NULL pointer.
Using punkVal in both the VT_UNKNOWN and the VT_DISPATCH case should
be OK, since IDispatch is derived from IUnknown, right?
Right.
Since the member variable that I store the X object in is a smart
pointer, I don't have to worry about AddRef/Release for it, right?
Right.
However, I do have to release the pointer that QueryInterface
returned, since QueryInterface should have done an AddRef on it before
giving it to me, right?
Not if you store the result in a smart pointer, which your code seems to
attempt to do.
--
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