【问题标题】:Using, StringCchCat使用,StringCchCat
【发布时间】:2015-02-14 18:00:51
【问题描述】:

我正在尝试使用StringCchCat 函数:

    HRESULT X;
    LPWSTR _strOutput =  new wchar_t[100];
    LPCWSTR Y =L"Sample Text";
    X = StringCchCat(_strOutput, 100, Y);

但由于某种原因,我不断收到来自 X 的 “E_INVALIDARG 一个或多个参数无效。” 错误。_strOutput 也充满了一些随机字符。 p>

这实际上是一个更大计划的一部分。所以我想要做的是将“示例文本”连接到空的 _strOutput 变量。这是在一个循环内,所以它会发生多次。对于这个特定示例,就好像我将文本“示例文本”分配给 _strrOutput。

有什么想法吗?

【问题讨论】:

  • 您没有初始化new wchar_t[100] 的内容,因此您最终会得到一个充满垃圾的初始字符串(并且可能正在发生缓冲区溢出)。 StringCchCat() 可以理解地拒绝将任何内容连接到这样的字符串(来自the docs,它认为“目标缓冲区已经满了”)。
  • 那么我用空格来初始化它吗?还是别的什么?
  • 视情况而定。你希望它是一个空字符串,一个充满空格的字符串,还是别的什么?你到底想达到什么目的?
  • 我已经更新了问题。希望它有所帮助,我想要将“示例文本”连接到一个空字符串
  • 嗯...为什么?为什么不直接复制字符串而不是连接到空字符串?

标签: c++ winapi c-strings lpcwstr


【解决方案1】:

如果它是循环的一部分,一个简单的*_strOutput = 0; 将解决您的问题。

如果您尝试复制一个字符串,而不是连接它,那么有一个特殊的函数可以为您执行此操作:StringCchCopy

编辑:顺便说一句,如果您正在使用 API 的TCHAR 版本(并且您是),您应该将您的字符串声明为TCHAR 数组(即LPTSTR 而不是LPWSTR,并且_T("") 而不是 L"")。这将使您的代码至少具有适度的可移植性。

【讨论】:

  • _T() 用于 C 运行时,与 _TCHAR 一起使用。 Windows API 使用 TEXT()TCHAR 代替。而且您不应该再宣传TCHAR。最好建议使用 Unicode API,在本例中为 StringCchCatW
  • 当然,如果。选择三个版本的 Windows API 之一并坚持使用它。混搭是毁掉一个男人几年后的一周的好方法。
【解决方案2】:

字符串复制/连接函数查找空终止符以知道复制/连接到哪里。您需要将_strOutput 的第一个元素初始化为零,以便缓冲区以空值终止,然后您可以根据需要将值复制/合并到它:

LPWSTR _strOutput =  new wchar_t[100];
_strOutput[0] = L'\0`; // <-- add this
X = StringCchCat(_strOutput, 100, Y);

【讨论】:

    【解决方案3】:

    我写这个答案是为了通知你(所以你会在任何 Stack Overflow 页面的顶部看到红色的 1),因为you had the same bug yesterday(在你的消息框中)我现在意识到我忽略了在我的回答中说这个昨天。

    请记住,WCHARint 等内置类型上的 new[] 运算符根本不会初始化数据。在调用new[] 之前,您获得的内存将包含任何垃圾,无论是什么。如果您将WCHAR x[100]; 作为局部变量,也会发生同样的情况。在使用数据之前,您必须小心初始化数据。编译器通常擅长警告您这一点。 (我相信 C++ 对象的每个元素都会调用它们的构造函数,所以 that 不会给你一个错误......当然,除非你忘记在类中初始化某些东西。已经有一段时间了。 )

    在许多情况下,您会希望一切都为零。 '\0'/L'\0' 字符也是零。 Windows API 有一个函数ZeroMemory(),它是用零填充内存的快捷方式:

    ZeroMemory(array, size of array in bytes)
    

    所以要初始化一个WCHAR str[100] 你可以说

    ZeoMemory(str, 100 * sizeof (WCHAR))
    

    sizeof (WCHAR) 将 100 WCHARs 转换为其等效字节数。

    正如其他答案所说,只需将字符串的第一个字符设置为零就足够了。您的选择。

    还只是为了确保:您是否阅读了其他问题的其他答案?它们更适合您尝试执行的任务(而且我对流程 API 完全不了解;我刚刚查看了文档以获取答案)。

    【讨论】:

    • 感谢您的信息,非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-23
    • 2015-09-08
    • 2020-12-19
    • 2017-11-20
    相关资源
    最近更新 更多