我是COM新手,我认为我所拥有的是正确的,但是运行时不喜欢它。任何帮助深表感谢。
我需要调用一个包含BSTR的一维数组的COM函数。具体来说,文档说该参数必须为:
功能:AddFiles([in VARIANT * filePaths)
filePaths每个文件或完整文件的完整路径的一维数组
夹。 filePaths可以是类型
VT_ARRAY|VT_VARIANT
,其中每个条目
是VT_BSTR
或VT_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函数的要求和所拥有的代码,任何人都对我可能有的想法有所了解做错了吗?
最佳答案
如果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);