2010-03-15 3 views
0
CComBSTR wsData = (char*)pvData; 

quand constuct CComBSTR, appelez A2WBSTR, mais parfois nResult = nConvertedLen, juste 1/20!. pourquoi?pourquoi nResult = nConvertedLen, lorsque l'utilisation CComBSTR;!

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

Répondre

0

Ma meilleure idée est qu'il existe des problèmes de multi-threading impliqués. Comme vous pouvez le voir à la fois nResult et nConvertedLen sont les résultats aux appels à MultiByteToWideChar avec le même source string. Le premier appel est utilisé pour déterminer simplement la longueur du tampon qui doit être allouée pour renvoyer le résultat de la conversion.

MultiByteToWideChar Documentation décrit le comportement de la fonction lorsque le paramètre de longueur de tampon est de 0:

cchWideChar

[in] Taille, en caractères larges, de la mémoire tampon pointé par le paramètre lpWideCharStr .

Si cette valeur est égale à zéro, la fonction retourne la taille du tampon nécessaire, en caractères larges, et ne fait aucune utilisation du tampon lpWideCharStr.

Ainsi, la seule fois que les deux valeurs seraient différentes est quand chaîne pointée par lp changements entre les appels, les plus probables en raison de problèmes de filetage.

Questions connexes