【问题标题】:COM: Create a VT_ARRAY with VT_BSTR valuesCOM:使用 VT_BSTR 值创建一个 VT_ARRAY
【发布时间】:2009-09-25 20:19:42
【问题描述】:

我是 COM 新手,我认为我所拥有的是正确的,但运行时不喜欢它。非常感谢任何帮助。

我需要调用一个接受一维 BSTR 数组的 COM 函数。具体来说,文档说参数必须是:

函数:AddFiles ([in] VARIANT * filePaths)

filePaths 每个文件的完整路径的单维数组或 文件夹。文件路径可以是类型 VT_ARRAY|VT_VARIANT,其中每个条目 是VT_BSTR,或VT_ARRAY|VT_BSTR

我有一个vector<wstring> myPaths 的路径,我想将其传递给采用上述参数的函数。这是我写的代码。在 myComObject 上调用 AddFiles 会产生一个 AV(myComObject 不为空,我可以在其上调用其他方法):

        ...
        VARIANT filePaths;
        VariantInit( &filePaths );
        filePaths.vt = VT_ARRAY|VT_VARIANT;
        filePaths.parray = SafeArrayCreateVector( VT_BSTR, 0, (unsigned int) myPaths.size() );

        long i = 0;
        for( vector<wstring>::iterator it = myPaths.begin();
            it != myPaths.end();
            it++, i++ )
        {
            BSTR myPath= SysAllocString(it->c_str());
            SafeArrayPutElement( filePaths.parray, &i, myPath);
        }

        myComObject->AddFiles( &filePaths );
        ...

COM 对象不是我的代码,我无法对其进行调试,但我怀疑我没有正确创建该数组 - 基于 AddFiles 函数的要求和我拥有的代码,任何人都有关于我可能做错了什么?

【问题讨论】:

  • 循环中存在内存泄漏——SafeArrayPutElement 复制传入的 BSTR,因此在将其添加到数组后需要确保 SysFreeString myPath。
  • 我认为最后调用 SafeArrayDestroy 会清理 BSTR ......不是真的吗?
  • 来自 MSDN 的 SafeArrayDestroy:“变体的安全数组将对每个成员调用 VariantClear,而 BSTR 的安全数组将对每个元素调用 SysFreeString”
  • 是的,它会销毁自己的副本。 SafeArrayPutElement 不获取您传递给它的 BSTR 的所有权,而是制作一个副本。所以你原来的 BSTR 仍然需要被释放。
  • 谢谢!

标签: com


【解决方案1】:

如果 myComObject->AddFiles 只能处理 VT_ARRAY|VT_VARIANT,下面的应该也可以。

VARIANT myPath;
VariantInit(&myPath);

myPath.vt = VT_BSTR;
myPath.bstrVal = SysAllocString(it->c_str());

SafeArrayPutElement(filePaths.parray, &i, &myPath);

【讨论】:

  • 如果是这样,您还需要在使用 SafeArrayCreateVector 创建 SAFEARRAY 时说 VT_VARIANT。
【解决方案2】:

你不想:

filePaths.vt = VT_ARRAY|VT_BSTR;

因为您要创建 BSTR 的 SafeArray?

【讨论】:

  • 因此,请尝试将其保留为 VT_ARRAY|VT_VARIANT,然后按照下面 taichicat 的建议将每个字符串打包成一个变体,而不是在循环中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-25
  • 2011-09-10
  • 2018-10-23
  • 1970-01-01
  • 2015-03-12
  • 2010-11-03
  • 1970-01-01
相关资源
最近更新 更多