c++ - 在 VARIANT 和 _variant_t 之间复制

标签 c++ visual-c++ com ole variant

我相当确定我可以安全地做:

void funcA(VARIANT &V,_variant_t &vt)
{
    vt = V;
}

但反过来呢:

void funcB(VARIANT &V,_variant_t &vt)
{
    V = vt;
}

我一直在我的应用程序中看到一些非常奇怪的行为,我将其归因于与 COM 相关的线程问题。但后来我想知道我是否错误地使用变体来搞砸内存。在 funcB 中,VARIANT V 是为 COM 调用准备的安全数组的一部分。对于我的 V=vt 行,我是否在做一个浅拷贝,当同一个变体被释放两次时,它会破坏事情?

我真的很喜欢 _variant_t 并避免使用所有::VariantXXX 方法,有没有一种巧妙的方法可以在 funcB 中使用 _variant_t 来自动复制?

最佳答案

首先,是的,通过像在 funcB() 中那样使用赋值运算符,您只调用浅拷贝(您可能想查看 oaidl.h 以查看 VARIANT 定义 - 它没有用户定义的赋值运算符,因此浅拷贝由编译器完成。

如果您从中复制的其他变体在您访问浅拷贝之前被清除(例如,如果变体类型是 VT_UNKNOWN,则指向的对象可以简单地在之后被销毁通过调用 IUnknown::Release() 将引用计数设置为 0。

_variant_t 对您没有多大帮助,因为它没有复制到另一个对象的方法 - 请参阅类定义的 comutil.h - 它只会从另一个对象复制到自身。

最简单的方法是使用 VariantCopy()。不确定在处理时是否会初始化 safearray。如果它是用具有 VT_EMPTY 的每个元素初始化的,您只需调用 VariantCopy()。否则首先调用目标上的 VariantInit() 来初始化目标。为包含随机未初始化数据的目标调用 VariantCopy() 可能会导致未定义的行为。

关于c++ - 在 VARIANT 和 _variant_t 之间复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1791447/

相关文章:

c++ - 如何检查另一个源字符串中的特定字符串

c++ - 如何获取 IShellFolder 的 PIDL

c# - 使用 COM Interop 复制 Excel 工作表会丢失单元格颜色

javascript - 使用 powershell 操作 javascript 下拉菜单

c++ - 线程 vs 基于任务 vs 异步编程

c++ - visual studio 窗口从其他类调用函数

c++ - 为什么可变参数函数不能 "eat"C++11 中的列表初始化参数?

c++ - 如何使用循环检查等价性,如果不等价则执行一些代码?

c++ - Windows API 和字符串连接

python - pip - 无法找到 vcvarsall.bat