BStr e SysAllockStringByteLen () em C ++
-
07-07-2019 - |
Pergunta
Eu sou novo para C ++, então isso pode ser uma pergunta noobish; Eu tenho a seguinte função:
#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.
}
Quando eu depurar através deste código, eu passo na conta número "A101683", por exemplo. Quando se faz a parte SysAllocStringByteLen (), o número da conta torna-se uma combinação de símbolos chineses ...
Qualquer um que podem lançar alguma luz sobre isso?
Solução
SysAllocStringByteLen é para quando você está criando um BSTR que contém dados binários, cordas não reais - não ANSI para conversão Unicode é executada. Isso explica por que os shows depurador a corda como contendo símbolos aparentemente chineses, ele está tentando interpretar a seqüência ANSI copiado para o BSTR como unicode. Você provavelmente deve usar SysAllocString vez - isso irá converter o corda corretamente para unicode você deve passar uma seqüência de caracteres Unicode. Se você estiver trabalhando com texto real, esta é a função que você deve usar.
Outras dicas
Em primeiro lugar, há um problema com a linha que contém SAFECOPYLEN. Está faltando ')' e não está claro o que é suposto fazer.
A segunda questão é que você não está usando AccountNo em qualquer lugar este código. tmpAccountNumber está na pilha, e poderia ter qualquer coisa nele.
BSTR são arrays de caracteres de dois bytes para que você não pode simplesmente copiar um char * array nele. Em vez de passá-lo "A12123"
tentar 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.
}