【问题标题】:How to pass BSTR to printf?如何将 BSTR 传递给 printf?
【发布时间】:2015-09-09 14:36:56
【问题描述】:

我有一个使用 VS2013 构建的非 unicode (MBCS) C++ 项目。

给定一个BSTR 值,我应该如何安全地将它传递给 printf?

【问题讨论】:

  • 你搜索了吗? This 会带你去那里的大部分时间......
  • Convert BSTR to char* 的可能重复项。
  • 不是重复的。 printf 可以打印 wchar_t 所以转换没有意义。
  • 只需使用 %ls 格式说明符。
  • 我进行了搜索,发现在其他网站上没有直接重复或直接答案 - 我发现这非常令人惊讶。我想知道_bstr_t 是否是答案,因为它经常与 BSTR 一起使用?

标签: c++ printf bstr


【解决方案1】:

BSTR 确实是带有前面长度信息的WCHAR*。您可以出于打印目的忽略该长度部分。所以:

BSTR str = foo();
printf("%S", str); // Capital S

【讨论】:

  • 你能指出大写 S printf 说明符的文档吗?它似乎不是标准的 C。
  • @user2079303 msdn.microsoft.com/en-us/library/hf4y5e3w.aspx - 这是 MSDN,所以它 Microsoft 特定的 - 链接是这样说的。
  • 我认为BSTR 是微软特有的,这不是问题。 %ls 是可移植的。
  • 你也可以使用wprintf()
【解决方案2】:

BSTR 是指向以长度为前缀(在偏移量 -4 处)和以0 结尾的宽字符串的指针。您可以将它传递给任何能够处理以0 结尾的宽字符串的函数。 (实际的字符串从偏移量0开始。)

如果目标函数不能处理宽字符,那么您需要将字符串转换为多字节字符(如果您想使用标准printf,而S 类型字段字符不可用,则会出现这种情况)。此(已评论)链接提供了相关信息:Convert BSTR to char*

@MSalters 的答案有代码示例(不想重复 2 条琐碎的行):https://stackoverflow.com/a/32482688/682404

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-27
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 2014-02-27
    • 2016-06-05
    • 1970-01-01
    相关资源
    最近更新 更多