我是一个COM新手,我认为我所拥有的是正确的,但是运行时并不喜欢它。任何帮助都是非常感谢的。
我需要调用一个COM函数,它接受一个BSTR的一维数组。具体来说,文档说参数必须是:
函数: AddFiles (在变量* filePaths中)
filePaths每个文件或文件夹的全路径的单维数组.filePaths可以是VT_ARRAY|VT_VARIANT类型,其中每个条目都是VT_BSTR或VT_ARRAY|VT_BSTR。
我有一个路径的vector<wstring> myPaths,我想把它传递到接受上面参数的函数中。这是我写的代码。在AddFiles上调用myComObject会导致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函数的要求和我所拥有的代码,有人知道我可能做错了什么吗?
发布于 2009-09-21 22:43:40
如果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);发布于 2009-09-21 21:37:01
你不想:
filePaths.vt = VT_ARRAY|VT_BSTR;既然你正在创建一个BSTR的SafeArray?
https://stackoverflow.com/questions/1456400
复制相似问题