Hi there,

I have a Variant variable containing an interface (obtained from a call to IDispatch::Invoke).

Does VariantClear() call IUnknown::Release before actually clearing the variable or do I have to take care of that myself?
Posted on 2001-11-29 11:22:45 by Morris
It would be pretty safe to assume the API would do that, but it's always safest to check MSDN:

"Use this function to clear variables of type VARIANTARG (or VARIANT) before the memory containing the VARIANTARG is freed (as when a local variable goes out of scope).

The function clears a VARIANTARG by setting the vt field to VT_EMPTY and the wReserved field to 0. The current contents of the VARIANTARG are released first. If the vt field is VT_BSTR, the string is freed. If the vt field is VT_DISPATCH, the object is released. If the vt field has the VT_ARRAY bit set, the array is freed.

In certain cases, it may be preferable to clear a variant in code without calling VariantClear. For example, you can change the type of a VT_I4 variant to another type without calling this function. However, you must call VariantClear if a VT_type is received but cannot be handled. Using VariantClear in these cases ensures that code will continue to work if Automation adds new variant types in the future."

So it does.
Posted on 2001-11-29 21:23:59 by Ernie