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;
}