我正在编写一个 COM 服务器实现。其中一种方法必须返回 VARIANT。在 idl 我有这个声明
HRESULT _stdcall Method([out, retval] VARIANT * res);
它产生这样一个h文件
STDMETHOD(Method)(VARIANT * res);
问题:如何正确返回结果?我应该调用方法VariantInit(res)
吗?还是调用者在做呢?如果是这样,我应该提前打电话VariantClear(res)
吗?还是我总是得到一个指向未初始化的 VARIANT 的指针?
或者我应该有这样的代码?
if (res->vt != VT_EMPTY)
VariantClear(res);
VariantInit(res);
然后必须将此 VARIANT 编组到另一个进程中。
指针
res
不能包含指向垃圾内存的指针,因此在我们调用的函数VariantClear(res)
中,如有必要,将清除 res(减少引用计数器)和 set 的内容vt = VT_EMPTY
,然后根据需要使用此指针。第二种方式:我们使用类
ATL::CComVariant
,最后我们调用Detach(res)
. 他还将调用内部VariantClear(res)
,将结构复制到 restagVARIANT
并放弃对它的权利。