A2W用来转换Ansi为unicode字符,一般用来都没有问题。
不过,我的程序放到用户那里产生了栈溢出崩溃,发现崩溃在A2W上,于是看了一下它的实现:
#define A2W(lpa) (\
((_lpa = lpa) == NULL) ? NULL : (\
_convert = (lstrlenA(_lpa)+1),\
(INT_MAX/2<_convert)? NULL : \
ATLA2WHELPER((LPWSTR) alloca(_convert*sizeof(WCHAR)), _lpa, _convert, _acp)))
再看alloca的msdn说明:
Allocates memory on the stack. This function is deprecated because a more secure version is available; see_malloca.
void *_alloca(
size_t size
); |
原来,alloca函数是在栈上分配的内存,栈上的内存是有大小限制的,并且默认很小,只有1MB,所以当传入了字符串太大时,就会引起栈溢出。
解决的办法,就是不使用A2W,而是自己使用MultiByteToWideChar进行转换。