【发布时间】:2010-10-09 06:18:39
【问题描述】:
到目前为止,我发现我可以通过两种(很多?)方式将传入的 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 宏可能隐藏了各种乐趣和游戏。
哪个代码更高效/更快?或者,我可以使用另一种技术来更好地完成这项工作吗?
【问题讨论】:
-
第二个代码具有未定义的行为,因为它写入超出了分配缓冲区的末尾。