OLE bstr不是null终止?

所以,我试图从C ++和OLE自动化Excel,使用Microsoft提供的Autowrapfunction,在他们的自动化示例中。

我已经得到了,我可以从电子表格的单元格中读取string值。 但是,对于某些值来说,string有些问题,比如它不是以null结尾。 这是我的代码:

 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文件。)

John Doeá,11

代码是很有问题的,需要修复。 结果variables不能是IDispatch,它必须是VARIANT 。 你一味地认为Range.Cell.Value属性返回一个string,这不是Excel的工作方式。 调用VariantChangeType()强制转换为VT_BSTR是必需的。

á字符是另外一个简单的文本编码问题。 美元甜甜圈,你从控制台窗口复制string。 在西欧和美洲默认使用代码页437 。 该代码页中的字符代码是0xA0。 实际上, U + 00A0是Unicode中的一个非破坏性空间 ,在现代文本中并不是一个不寻常的代码点。

要实际在控制台模式下显示为空间,需要调用SetConsoleOutputCP()将其切换到CP_UTF8 ,并将控制台的字体从terminal更改为Consolas等TrueType字体。 在本网站的其他Q + A中已经有所涉及。