Pregunta

Soy nuevo en C ++, así que esta puede ser una pregunta novata; Tengo la siguiente función:

#define SAFECOPYLEN(dest, src, maxlen)                               \
{                                                                    \
    strncpy_s(dest, maxlen, src, _TRUNCATE);                          \
    dest[maxlen-1] = '\0';                                            \
}

short _stdcall CreateCustomer(char* AccountNo)
{
    char tmpAccountNumber[9];
    SAFECOPYLEN(tmpAccountNumber, AccountNo, 9);
    BSTR strAccountNumber = SysAllocStringByteLen(tmpAccountNUmber, 9);

    //Continue with other stuff here.
}

Cuando depuro este código, paso el número de cuenta "A101683" por ejemplo. Cuando hace la parte SysAllocStringByteLen (), el número de cuenta se convierte en una combinación de símbolos chinos ...

¿Alguien que pueda arrojar algo de luz sobre esto?

¿Fue útil?

Solución

SysAllocStringByteLen está diseñado para cuando se crea un BSTR que contiene datos binarios, no cadenas reales: no se realiza la conversión de ANSI a unicode. Esto explica por qué el depurador muestra que la cadena contiene símbolos aparentemente chinos, está tratando de interpretar la cadena ANSI copiada en el BSTR como unicode. Probablemente debería usar SysAllocString en su lugar - esto convertirá el cadena correctamente a unicode debe pasarle una cadena unicode. Si está trabajando con texto real, esta es la función que debería usar.

Otros consejos

En primer lugar, hay un problema con la línea que contiene SAFECOPYLEN. Falta ')' y no está claro qué se supone que debe hacer.

El segundo problema es que no está utilizando AccountNo en ninguna parte de este código. tmpAccountNumber está en la pila y podría tener algo.

BSTR son matrices de caracteres de doble byte, por lo que no puede simplemente copiar una matriz char * en él. En lugar de pasarlo " A12123 " intente L " A12323 " .

short _stdcall CreateCustomer(wchar_t* AccountNo)
{
wchar_t tmpAccountNumber[9];
wcscpy(tmpAccountNumber[9], AccountNo);
BSTR strAccountNumber = SysAllocStringByteLen(tmpAccountNUmber, 9);

//Continue with other stuff here.
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top