OLE bstr不是null终止?
所以,我试图从C ++和OLE自动化Excel,使用Microsoft提供的Autowrap
function,在他们的自动化示例中。
我已经得到了,我可以从电子表格的单元格中读取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中已经有所涉及。