OLE bstr不是null终止?

时间:2015-10-06 07:49:30

标签: c++ excel com ole idispatch

所以,我正在尝试使用Microsoft在其自动化示例中提供的Autowrap函数从C ++和OLE自动化Excel。

我已经知道我可以从电子表格中的单元格中读取字符串值。但是,对于某些值来说,字符串似乎有问题,就像它没有以空值终止一样。这是我的代码:

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文件中显示时,它显示如下:

John Doe

(Excel文档的代码页可能会出现问题吗?它是xlsx文件。)

1 个答案:

答案 0 :(得分:4)

  

JohnDoeá,11

代码非常错误,需要修复。 结果变量不能是IDispatch,它必须是VARIANT。您盲目地假设Range.Cell.Value属性返回一个字符串,这不是Excel的工作方式。

需要调用VariantChangeType()来强制转换为VT_BSTR

á字符是一个简单的文本编码问题。美元到甜甜圈,你从控制台窗口复制了字符串。在西欧和美洲默认使用code page 437。该代码页中á的字符代码为0xA0。其中实际上 U + 00A0,Unicode中的non-breaking space,而不是现代文本中的异常代码点。

让它实际显示为控制台模式应用程序中的空间需要调用SetConsoleOutputCP()将其切换到CP_UTF8并将控制台的字体从终端更改为类似Consolas的TrueType字体。在本网站的其他Q + A中有很好的涵盖。