我是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()部分时,帐号将成为中文符号的组合......
任何人都可以对此有所了解吗?
答案 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.
}