COM:创建VT_BSTR值VT_ARRAY(COM: Create a VT_ARRAY with

2019-08-08 13:44发布

我是一个COM新手,我想我有什么是正确的,但运行时不喜欢它。 任何帮助深表感谢。

我需要调用一个COM函数,它在BSTRs的一维阵列。 具体来说,文件说,该参数必须是:

功能:AddFiles([IN] VARIANT *文件路径)

文件路径的完整路径的每个文件或文件夹的单一尺寸的阵列。 文件路径可以是类型的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功能的要求,我的代码,任何人有想法我可能是做错了什么?

Answer 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);


Answer 2:

难道你不想要的:

filePaths.vt = VT_ARRAY|VT_BSTR;

既然你要创建BSTRs的安全数组?



文章来源: COM: Create a VT_ARRAY with VT_BSTR values
标签: com