BSTR и SysAllockStringByteLen () в C ++ - PullRequest
       11

BSTR и SysAllockStringByteLen () в C ++

0 голосов
/ 16 сентября 2009

Я новичок в C ++, так что это может быть нубийским вопросом; У меня есть следующая функция:

#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.
}

Когда я отлаживаю с помощью этого кода, я передаю номер счета "A101683", например. Когда он выполняет часть SysAllocStringByteLen (), номер счета становится комбинацией китайских символов ...

Кто-нибудь может пролить свет на это?

Ответы [ 3 ]

4 голосов
/ 16 сентября 2009

SysAllocStringByteLen предназначен для случаев, когда вы создаете BSTR, содержащий двоичные данные, а не фактические строки - преобразование ANSI в Unicode не выполняется. Это объясняет, почему отладчик показывает строку как содержащую явно китайские символы, он пытается интерпретировать строку ANSI, скопированную в BSTR, как юникод. Вы, вероятно, должны использовать SysAllocString вместо - , это будет правильно преобразовывать строку в Unicode , вы должны передать ей строку Unicode. Если вы работаете с реальным текстом, вам следует использовать эту функцию.

0 голосов
/ 16 сентября 2009

BSTR - это двухбайтовые массивы символов, поэтому вы не можете просто скопировать в них массив char *. Вместо передачи "A12123" попробуйте 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.
}
0 голосов
/ 16 сентября 2009

Прежде всего, существует проблема со строкой, содержащей SAFECOPYLEN. Он отсутствует ")" и неясно, что он должен делать.

Вторая проблема заключается в том, что вы нигде не используете AccountNo в этом коде. tmpAccountNumber находится в стеке и может содержать что угодно.

...