2

私は 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() 部分を実行すると、口座番号が漢字の組み合わせになります...

これに光を当てることができる人はいますか?

4

3 に答える 3

6

SysAllocStringByteLenは、実際の文字列ではなく、バイナリ データを含む BSTR を作成する場合に使用します。ANSI から Unicode への変換は実行されません。これは、デバッガーが明らかに中国語の記号を含む文字列を表示する理由を説明しており、BSTR にコピーされた ANSI 文字列を Unicode として解釈しようとしています。おそらく、代わりにSysAllocStringを使用する必要があります。これにより、文字列が正しく Unicode に変換されるため、Unicode 文字列を渡す必要があります。実際のテキストで作業している場合、これは使用すべき関数です。

于 2009-09-16T08:17:31.910 に答える
0

まず、SAFECOPYLEN を含む行に問題があります。')' が欠落しており、何をすべきか明確ではありません。

2 つ目の問題は、このコードのどこにも AccountNo を使用していないことです。tmpAccountNumber はスタック上にあり、その中には何でもある可能性があります。

于 2009-09-16T08:10:38.037 に答える
0

BSTR は 2 バイト文字配列であるため、char* 配列を単純にコピーすることはできません。渡す代わりに、"A12123"tryを試してください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.
}
于 2009-09-16T08:20:00.910 に答える