0

我正在尝试使用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。

有任何想法吗?

4

3 回答 3

2

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

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

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

于 2015-02-14T18:18:36.937 回答
1

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

LPWSTR _strOutput =  new wchar_t[100];
_strOutput[0] = L'\0`; // <-- add this
X = StringCchCat(_strOutput, 100, Y);
于 2015-02-14T18:19:26.660 回答
1

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

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

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

ZeroMemory(array, size of array in bytes)

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

ZeoMemory(str, 100 * sizeof (WCHAR))

其中sizeof (WCHAR)100WCHAR秒变为其等效字节数。

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

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

于 2015-02-14T21:06:01.067 回答