使用,StringCchCat

时间:2015-02-14 18:00:52

标签: c++ winapi c-strings lpcwstr

我尝试使用StringCchCat功能:

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

但由于某种原因,我一直得到 " E_INVALIDARG一个或多个参数无效。" 错误来自X. _strOutput也满了一些随机字符。

这实际上是一个更大的计划的一部分。所以我试图做的是连接"示例文本"到空_strOutput变量。这是在一个循环中,所以它会发生多次。对于这个特殊的例子,就像我分配文本"示例文本"到_strrOutput。

任何想法?

3 个答案:

答案 0 :(得分:2)

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

如果你反而试图复制一个字符串而不是连接它,那么有一个特殊功能可以帮助你:StringCchCopy

编辑:顺便说一句,如果您使用的是TCHAR版本的API(并且您是),则应将字符串声明为TCHAR数组(即{{1}而不是LPTSTRLPWSTR而不是_T(""))。这样可以使您的代码至少具有轻微的便携性。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

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

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

ZeroMemory(array, size of array in bytes)

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

ZeoMemory(str, 100 * sizeof (WCHAR))

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

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

另外,只是为了确保:您是否已阅读其他问题的其他答案?他们更倾向于你正在尝试的任务(而且我对流程API一无所知;我只是检查了文档以获得我的答案)。