OLE bstr не обнуляется?

Итак, я пытаюсь автоматизировать Excel из C ++ и OLE, используя Autowrap функция, предоставляемая Microsoft в их примерах автоматизации.

Я дошел до того, что могу прочитать строковое значение из ячейки в электронной таблице. Однако, похоже, что для некоторых значений что-то не так со строкой, как будто она не завершена нулем. Вот мой код:

VARIANT result;
VariantInit(&result);
AutoWrap(DISPATCH_PROPERTYGET, &result, range, L"Value", 0);
wprintf(L"%s, len: %d\n", result.bstrVal, SysStringLen(result.bstrVal));
wprintf(L"abc %s\n", SysAllocString(L"def"));

Выход:

John Doe  á, 11
abc def

Принимая во внимание, что в файле Excel, когда отображается в Excel, он выглядит так:

John Doe

(Может ли кодовая страница документа Excel каким-то образом стать проблемой? xlsx файл.)

2

Решение

Джон Доу, 11

Код довольно глючный и должен быть исправлен. результат переменная не может быть IDispatch, она должна быть VARIANT, Вы слепо предполагаете, что свойство Range.Cell.Value возвращает строку, это не так, как работает Excel. Вызов VariantChangeType () для принудительного преобразования в VT_BSTR необходимо.

á символ — простая проблема кодирования текста. Доллары до пончиков, вы скопировали строку из окна консоли. Который использует кодовая страница 437 по умолчанию в Западной Европе и Америке. Код символа для á в этой кодовой странице — 0xA0. Который на самом деле U + 00A0, а неразрывный пробел в Unicode, не необычная кодовая точка в современном тексте.

Чтобы заставить его фактически отображаться как пробел в приложении в режиме консоли, необходимо вызвать SetConsoleOutputCP (), чтобы переключить его на CP_UTF8 и изменив шрифт консоли с терминала на шрифт TrueType, такой как Consolas. Хорошо освещено в других Q + A на этом сайте.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]