到目前为止,我发现我可以用两种(多种?)方式将传入的BSTR转换为ANSI,我很想知道在速度/效率等方面是否比另一种"更好".
我一直使用的方式是使用USES_CONVERSION
和W2A
宏,例如
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_CONVERSION
,W2A
宏和宏可能隐藏了各种各样的乐趣和游戏.
哪个代码更有效/更快?或者,是否有另一种我可以使用的技术可以更好地完成工作?
来自MSDN:
[...]建议的BSTR字符串转换方法是使用CComBSTR类.要转换为BSTR,请将现有字符串传递给CComBSTR的构造函数.要从BSTR转换,请使用COLE2 [C] DestinationType [EX],例如COLE2T.
从CComBSTR页面:
[...] CComBSTR类提供了许多成员(构造函数,赋值运算符和比较运算符),它们将ANSI或Unicode字符串作为参数.这些函数的ANSI版本效率低于它们的Unicode版本,因为临时Unicode字符串通常是在内部创建的.为提高效率,请尽可能使用Unicode版本.