OLE bstr 不是空终止的?

OLE bstr not null terminated?

因此,我尝试使用 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 文件中显示为 Excel 时,显示如下:

John Doe

(Excel 文档的代码页是否有问题?它是一个 xlsx 文件。)

John Doe á, 11

代码有很多错误,需要修复。 result 变量不能是 IDispatch,它必须是 VARIANT。您盲目地假设 Range.Cell.Value 属性 returns 是一个字符串,这不是 Excel 的工作方式。需要调用 VariantChangeType() 强制转换为 VT_BSTR

á 字符是一个简单的文本编码问题。 Dollars to donuts,你从控制台复制了字符串 window。在 Unicode 中使用 code page 437 by default in Western Europe and the Americas. The character code for á in that code page is 0xA0. Which is actually U+00A0, a non-breaking space,而不是现代文本中不常见的代码点。

让它在控制台模式应用程序中实际显示为 space 需要调用 SetConsoleOutputCP() 将其切换为 CP_UTF8 并将控制台的字体从终端更改为 TrueType 字体,例如安慰剂。在此站点的其他 Q+A 中有很好的介绍。