get_Fields(fields.GetSafeArrayPtr()); for ( LONG i = fields.Ge-6ren">
gpt4 book ai didi

c++ - 错误:在 CComVariant::Copy 中迭代 CComSafeArray 时出现 "bad variable type"

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:57:14 24 4
gpt4 key购买 nike

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
}

第 (1) 行:fields.GetAt(i) 返回 CComVariant。当我尝试将此值分配给 CComVariant fld 时调用复制构造函数和方法 CComVariant::Copy 在复制构造函数中。它引发异常(“错误的变量类型”,DISP_E_BADVARTYPE (0x80020008L))。同时,第 (2) 行运行良好。第 (1) 行有什么问题,以及如何解决它。

编辑:这是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;
}

最佳答案

You create an array of IUnknowns and then you are trying to interpret is as array of VARIANT. Those should be the same types, you want either array of unknowns and you pack interface into CComVariant before putting it into array in the getter, or otherwise caller will deal with array of interfaces.

当您发现实际数组元素类型与您将其转换为的类型不匹配时,您将需要更新您的 getter 实现和调用程序代码以相互匹配。

我个人的偏好是创建一个变体数组,VT_ARRAY | VT_VARIANT 并将数组放入 [out] VARIANT* 参数中。调用者会将其从变体展开回数组,检查数组类型,然后获取元素。这是一个最小的开销,并且围绕 VARIANT 类型的代码在互操作性方面是最好的 - 平均而言(在您的特定情况下,您肯定可以使用原始类型并且根本没有变体) .

关于c++ - 错误:在 CComVariant::Copy 中迭代 CComSafeArray 时出现 "bad variable type",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7992236/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com