【发布时间】:2018-05-17 06:20:31
【问题描述】:
我有一个用 C++ 编写的 COM 对象,其方法使用以下签名。假设变体包含 BSTR(只是 VT_BSTR,而不是 VT_BYREF | VT_BSTR)。
HRESULT myfunc(/*[in]*/ VARIANT param)
我想将类型更改为其他类型。如果VariantChangeType的第一个参数与第二个参数相同,则“变体将原地转换”。
那么,我可以原地转换吗?
HRESULT myfunc(/*[in]*/ VARIANT param)
{
VariantChangeType(¶m, param, 0, VT_I4);
}
或者我应该复制到第二个变体?
HRESULT myfunc(/*[in]*/ VARIANT param)
{
VARIANT temp;
VariantInit(&temp);
VariantChangeType(&temp, param, 0, VT_I4);
}
我的理解是后者是必需的,因为前者会释放 BSTR,它归客户端所有,应该由客户端释放。
【问题讨论】:
-
不,VariantChangeType() 将结果存储到另一个变体中。您作为第一个参数传递的那个。因此,完全没有理由释放 BSTR。除非你对结果变量做了一些不明智的事情,所以它不是空的,比如使用 VariantCopy :)
-
@HansPassant VariantChangeType() 的第一个参数可以与第二个参数相同,这意味着将就地转换变体。那么,也许更好的说法是,我应该就地转换还是转换为第二个变体?我已经更新了问题以澄清。
-
FWIW,我创建了一个 Gist 来演示这个问题:gist.github.com/Neuroboy23/efb3d45783faf03bd87ee2a69519ce84