我尝试使用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。
任何想法?
答案 0 :(得分:2)
如果它是循环的一部分,一个简单的*_strOutput = 0;
将解决您的问题。
如果你反而试图复制一个字符串而不是连接它,那么有一个特殊功能可以帮助你:StringCchCopy
。
编辑:顺便说一句,如果您使用的是TCHAR
版本的API(并且您是),则应将字符串声明为TCHAR
数组(即{{1}而不是LPTSTR
和LPWSTR
而不是_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一无所知;我只是检查了文档以获得我的答案)。