COM:使用VT_BSTR值创建VT_ARRAY

时间:2009-09-21 19:34:10

标签: com

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

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

  

功能:AddFiles([in] VARIANT * filePaths)

     

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

我有vector<wstring> myPaths个路径,我想传递给上面带参数的函数。这是我写的代码。在myComObject上调用AddFiles导致AV(myComObject不为null,我可以在其上调用其他方法):

        ...
        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函数和我的代码的要求,任何人都有关于它的想法我可能做错了什么?

2 个答案:

答案 0 :(得分:3)

你不想要:

filePaths.vt = VT_ARRAY|VT_BSTR;

既然你正在创建一个BSTR的SafeArray?

答案 1 :(得分:2)

如果myComObject-&gt; AddFiles只能处理VT_ARRAY | VT_VARIANT,则以下内容也应该有效。

VARIANT myPath;
VariantInit(&myPath);

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

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