【问题标题】:Which is better code for converting BSTR parameters to ANSI in C/C++?在 C/C++ 中将 BSTR 参数转换为 ANSI 的更好代码是什么?
【发布时间】:2010-10-09 06:18:39
【问题描述】:

到目前为止,我发现我可以通过两种(很多?)方式将传入的 BSTR 转换为 ANSI,我很想知道在速度/效率等方面,一种是否比另一种“更好”。

我一直在使用的方式是使用 USES_CONVERSIONW2A 宏,例如

BSTR __stdcall F(BSTR p1, BSTR p2 ) {
    USES_CONVERSION;

    LPSTR sNum1 = W2A( p1 );
    LPSTR sNum2 = W2A( p2 );

不过,最近我发现了另一种技术:

BSTR __stdcall F(BSTR p1, BSTR p2 ) {
    long amt = wcstombs( NULL, p1, 1 );
    sNum1 = (char *) malloc( amt ); 
    wcstombs( sNum1, p1, amt );
    *(sNum1 + amt) = '\0';

    amt = wcstombs( NULL, p2, 1 );
    sNum2 = (char *) malloc( amt ); 
    wcstombs( sNum2, p2, amt );
    *(sNum2 + amt) = '\0';

现在我承认,它更冗长,并且有两次调用 wcstombs,但据我所知,USES_CONVERSIONW2A 宏可能隐藏了各种乐趣和游戏。

哪个代码更高效/更快?或者,我可以使用另一种技术来更好地完成这项工作吗?

【问题讨论】:

  • 第二个代码具有未定义的行为,因为它写入超出了分配缓冲区的末尾。

标签: c++ c string cstring bstr


【解决方案1】:

来自MSDN

[...]与 BSTR 字符串相互转换的推荐方法是使用 CComBSTR 类。要转换为 BSTR,请将现有字符串传递给 CComBSTR 的构造函数。要从 BSTR 转换,请使用 COLE2[C]DestinationType[EX],例如 COLE2T。

从 CComBSTR 页面:

[...]CComBSTR 类提供了许多将 ANSI 或 Unicode 字符串作为参数的成员(构造函数、赋值运算符和比较运算符)。这些函数的 ANSI 版本的效率低于 Unicode 版本,因为临时 Unicode 字符串通常是在内部创建的。为了提高效率,请尽可能使用 Unicode 版本。

【讨论】:

    【解决方案2】:

    注意 Nick 批准的答案,虽然正确,但与描述宏的 MSDN 文档存在相同的问题。

    问题是某些宏,例如@Nick 列出的宏 - COLE2A,实际上并不存在。

    然而,在 MSDN 页面的下方,有一些文字可以提示您了解这一事实并引导您找出正确的宏!

    该文本列在下表中,如下文本:

    旧的字符串转换宏和新的字符串转换类之间有几个重要的区别:

    在新的 ATL 7.0 转换类列中。

    上面写着:

    OLE 总是等价于 W

    所以@Nick 示例中的宏实际上是 CW2A

    【讨论】:

      【解决方案3】:

      注意:

      如果您使用 ATL 宏,例如:COLE2[C]DestinationType[Ex](您可能应该这样做),请务必尽可能使用“C”版本,而不是您编写的非常量版本。它们可能等效于显式 BSTR->ASCII 转换(即:COLE2A),但对于不需要实际转换的转换(例如:为 UNICODE 编译时的 COLE2T),'C' 版本可以扩展为 noops,而非- 如果源字符串为 const,'C' 版本仍将复制(因为您表示您需要生成的字符串为非常量)。

      还要注意:

      新的 ATL7 宏并不总是需要USES_CONVERSION,但是它们分配临时的右值对象,而旧的宏使用_alloca。这可能很重要,也可能不重要,具体取决于您的使用情况(例如,不要在循环中使用旧的宏,它会运行很多次,这样做可能会导致堆栈崩溃)。

      【讨论】:

        【解决方案4】:

        我已经很久没有对 COM 或 BSTR 做任何事情了,但我的建议是停止将 BSTR 视为特殊的东西。将它们视为指向宽字符零终止字符串的指针......如果这样做,将它们转换为 ANSI 可能会更容易。检查Eric's Complete Guide to BSTR Semantics...

        【讨论】:

          猜你喜欢
          • 2023-03-14
          • 1970-01-01
          • 2015-07-08
          • 2012-01-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多