【问题标题】:BSTR and SysAllockStringByteLen() in C++C++ 中的 BSTR 和 SysAlllockStringByteLen()
【发布时间】:2009-09-16 08:02:41
【问题描述】:

我是 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()部分的时候,账号变成了中文符号的组合...

任何人都可以对此有所了解吗?

【问题讨论】:

  • 更新了 SAFECOPYLEN 定义。

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


【解决方案1】:

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

【讨论】:

  • 一般思路是对的,但是SysAllocString()不会进行ANSI-to-Unicode的转换。你需要自己做:stackoverflow.com/questions/606075/how-to-convert-char-to-bstr/…
  • 是的,我使用的是实际文本,而不是二进制数据。你的意思是在这种情况下我应该 SysAllocString() 而不是 SysAllocStringByteLen() 吗?
  • 是的,要获得 BSTR,您需要调用 SysAllocString() 或 SysAllocStringLen() 并按照链接的答案进行 ANSI 到 Unicode 的转换。
  • 我已经更新了正确的答案 - 这或多或少是一个想法 - 这些天我很少使用实际的 ANSI 字符串
【解决方案2】:

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

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

【讨论】:

  • 我只重新输入了与我的问题相关的函数部分。我弄错了,现在更新了。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2017-03-17
    • 2012-04-22
    • 1970-01-01
    • 2012-09-19
    • 2013-06-10
    • 2010-09-15
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多