错误:在 CComVariant 中"bad variable type":循环访问 CComSafeArray 时复制
Error: "bad variable type" in CComVariant::Copy when iterating through CComSafeArray
CComSafeArray<VARIANT> fields;
hr = _tab_file->get_Fields(fields.GetSafeArrayPtr());
for ( LONG i = fields.GetLowerBound(), ie = fields.GetUpperBound(); i <= ie; ++i)
{
CComVariant fld = fields.GetAt(i); // (1) raises DISP_E_BADVARTYPE (0x80020008L)
// Next code works fine
CComQIPtr<ITabField> field = fields.GetAt(i).punkVal; // (2) Ok
_bstr_t fieldName;
hr = field->get_Name(fieldName.GetAddress());
::OutputDebugString(fieldName + _T("n")); // Ok
}
Line (1): fields.GetAt(i)
返回CComVariant
。当我尝试将这个值分配给CComVariant fld
称为复制构造函数和方法CComVariant::Copy
在复制构造函数。它会引发一个异常("坏变量类型",DISP_E_BADVARTYPE (0x80020008L)
)。同时,线路(2)运行良好。第(1)行有什么问题,如何修复
EDIT:这是get_Field
的代码(填充SAFEARRAY
)。
STDMETHODIMP TabFile::get_Fields( SAFEARRAY** fields )
{
if(mapInfoFile_ == 0)
return E_UNEXPECTED;
int fieldCount = getFieldCount();
SAFEARRAY* arr = ::SafeArrayCreateVector(VT_UNKNOWN, 0, fieldCount);
for(LONG i = 0; i < fieldCount; i++)
{
QField* field = getQField(i);
ITabField* tabField = TabField::CreateInstance();
tabField->put_Name(_bstr_t(field->GetNameRef()));
tabField->put_Type(field->GetNativeFieldType(i));
::SafeArrayPutElement(arr, &i, tabField);
tabField->Release();
}
*fields = arr;
return S_OK;
}
你创建了一个
IUnknown
s的数组,然后你试图解释是VARIANT
的数组。这些应该是你想要的相同类型任意一个未知数组,然后将接口装入CComVariant
在将它放入getter中的数组之前,否则调用者将会处理接口数组
当您发现实际数组元素类型与要将其转换为的类型不匹配时,您需要更新getter实现和调用方代码以使其相互匹配。
我的个人偏好是创建一个变量数组,VT_ARRAY | VT_VARIANT
并将该数组放入[out] VARIANT*
参数。调用者将把它从变体解回数组,检查数组类型,然后获取元素。这是一个最小的开销,并且围绕VARIANT
类型的代码在互操作性方面(平均而言)是最好的(在您的特殊情况下,您肯定可以很好地使用原始类型,而不需要任何变体)。
我认为你有典型的差一错误。ie
是在最后一个元素之后的一个元素,所以i == ie
时fields.GetAt(i)
将返回一个不存在的元素。在for
循环终止条件下,尝试用i < ie
替换i <= ie
,看看是否有效。
即使CComVariant
复制构造函数对i == ie
失败,下一个赋值似乎可以工作,因为CComQIPtr<ITabField>
复制构造函数可能对在伪CComVariant
的punkVal
字段检索到的任何内容都很满意。
- 如何循环访问常量字符**?
- 如何在 c++ 中仅循环访问特定列?
- 从嵌套循环中的 std::list 中删除将返回访问冲突
- C++ - 循环访问指针数组会导致错误
- 视觉 如何循环访问C++中遵循类似格式的多个.txt文件?
- 如何在C++中循环访问未知对象方法?
- 如何循环访问 cpp 中的函数返回的字符指针数组
- 在C++中循环访问自定义结构列表的小问题
- 有没有办法在C++中循环访问对象的不同数据成员
- 循环访问还包含未使用元素的字符串数组
- Pybind11:使用 for 循环使用 OpenMP 访问 python 对象
- 循环访问资源字符串表
- 在C++中循环访问类继承
- c++ 循环访问对象列表并删除对象
- 循环访问自定义双链表
- 循环访问对象列表 c++
- C++ 访问 if 语句(如果它们在 for 循环中)
- 从文件读取,并循环访问文件以写入数组
- 当我用"ñ"字符循环访问字符串时出现奇怪的结果
- 如何访问循环中结构的成员