Gayle123 Ответов: 1

Сбой в cstring при назначении


Колевариант олевар;
rst. GetFieldValue(a, olevar);
CString str = (LPCTSTR)olevar. bstrVal; (carshing)


он грохочет на улице ..
когда олевар имеет двойную ценность. пожалуйста, дайте мне знать, почему он рушится.

Что я уже пробовал:

Колевариант олевар;
rst. GetFieldValue(a, olevar);
CString str = (LPCTSTR)olevar. bstrVal; (carshing)

1 Ответов

Рейтинг:
9

Jochen Arndt

COleVariant является производным от VARIANT (Типы данных VARIANT и VARIANTARG [автоматизация][^]) который является просто union.

Поэтому вы должны проверить vt член и доступ только к соответствующему полю данных. Если ваш olevar содержит double (vt является VT_R8), соответствующее поле dblVal Доступ к любым другим полям может привести к неправильным значениям или неопределенному поведению.

Вы можете сделать преобразование самостоятельно:

CString str;
if (oleVar.vt == VT_R8)
    str.Format(_T("%E"), oleVar.dblVal);

Другой вариант-преобразование типа варианта с помощью COleVariant:: ChangeType[^]:
oleVar.ChangeType(VT_BSTR);
CString str = oleVar.bstrVal;

Обратите внимание также, что никакого приведения к LPCTSTR используется в приведенном выше примере. BSTR всегда является Юникодом, и приведенное выше назначение преобразует строку в ANSI с не-Юникодными сборками при приведении к LPCTSTR не будет работать с не-Юникодными сборками (он будет копировать только первый символ).


Gayle123

спасибо