почему nResult! = nConvertedLen , при использовании CComBSTR ; - PullRequest
0 голосов
/ 15 марта 2010
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 голосов
/ 15 марта 2010

Мое лучшее предположение заключается в том, что возникают проблемы с многопоточностью. Как вы можете видеть, nResult и nConvertedLen являются результатами вызовов MultiByteToWideChar с одинаковой исходной строкой . Первый вызов используется просто для определения длины буфера, который должен быть выделен для возврата результата преобразования.

Документация MultiByteToWideChar описывает поведение функции, когда параметр длины буфера равен 0:

cchWideChar

[in] Размер в широких символах буфера, на который указывает Параметр lpWideCharStr.

Если это значение равно нулю, функция возвращает необходимый буфер размер, широкими буквами, и не делает использование буфера lpWideCharStr.

Таким образом, единственное время, когда два значения будут различаться, это когда строка, на которую указывает lp, переключается между вызовами, скорее всего из-за проблем с многопоточностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...