CComBSTR wsData = (char*)pvData;
当构造CComBSTR时,调用A2WBSTR,但有时nResult!= nConvertedLen,只需1/20。为什么呢?
inline BSTR A2WBSTR(_In_opt_ LPCSTR lp, int nLen = -1)
{
if (lp == NULL || nLen == 0)
return NULL;
USES_CONVERSION_EX;
BSTR str = NULL;
#pragma warning(push)
#pragma warning(disable: 6385)
int nConvertedLen = MultiByteToWideChar(_acp_ex, 0, lp,
nLen, NULL, NULL);
#pragma warning(pop)
int nAllocLen = nConvertedLen;
if (nLen == -1)
nAllocLen -= 1; // Don't allocate terminating '\0'
str = ::SysAllocStringLen(NULL, nAllocLen);
if (str != NULL)
{
int nResult;
nResult = MultiByteToWideChar(_acp_ex, 0, lp, nLen, str, nConvertedLen);
ATLASSERT(nResult == nConvertedLen);
if(nResult != nConvertedLen)
{
SysFreeString(str);
return NULL;
}
}
return str;
}
答案 0 :(得分:0)
我最好的猜测是涉及多线程问题。正如您所看到的,nResult
和nConvertedLen
都是{strong}相同源字符串对MultiByteToWideChar
的调用的结果。第一个调用用于简单地确定需要分配的缓冲区的长度,以返回转换结果。
MultiByteToWideChar Documentation描述了当缓冲区长度参数为0时函数的行为:
cchWideChar
[in]以宽字符表示的缓冲区指定的缓冲区大小 lpWideCharStr参数。
如果此值为零,则该函数返回所需的缓冲区 大小,宽字符,没有 使用lpWideCharStr缓冲区。
因此,两个值不同的唯一时间是lp
指向的字符串在调用之间发生变化,很可能是由于线程问题。