为什么nResult!= nConvertedLen,当使用CComBSTR时;

时间:2010-03-15 03:00:43

标签: c++ string

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;
}

1 个答案:

答案 0 :(得分:0)

我最好的猜测是涉及多线程问题。正如您所看到的,nResultnConvertedLen都是{strong}相同源字符串对MultiByteToWideChar的调用的结果。第一个调用用于简单地确定需要分配的缓冲区的长度,以返回转换结果。

MultiByteToWideChar Documentation描述了当缓冲区长度参数为0时函数的行为:

  

cchWideChar

     

[in]以宽字符表示的缓冲区指定的缓冲区大小   lpWideCharStr参数。

     

如果此值为零,则该函数返回所需的缓冲区   大小,宽字符,没有   使用lpWideCharStr缓冲区。

因此,两个值不同的唯一时间是lp指向的字符串在调用之间发生变化,很可能是由于线程问题。