C ++中的BSTR和SysAllockStringByteLen()

时间:2009-09-16 08:02:41

标签: .net c++ visual-studio-2008 string chars

我是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 个答案:

答案 0 :(得分:4)

SysAllocStringByteLen用于创建包含二进制数据的BSTR,而不是实际字符串 - 不执行ANSI到unicode转换。这解释了为什么调试器将字符串显示为包含明显中文符号的原因,它试图将复制到BSTR中的ANSI字符串解释为unicode。您应该使用SysAllocString代替 - 这会将字符串正确转换为unicode 您必须将其传递给unicode字符串。如果您正在使用实际文本,这是您应该使用的功能。

答案 1 :(得分:0)

首先,包含SAFECOPYLEN的行存在问题。它缺少')'并且不清楚它应该做什么。

第二个问题是您在此代码中的任何位置都没有使用AccountNo。 tmpAccountNumber在堆栈中,可以包含任何内容。

答案 2 :(得分:0)

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