使用,StringCchCat

Using, StringCchCat

我正在尝试使用 StringCchCat 函数:

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

但由于某些原因,我不断收到来自 X 的 "E_INVALIDARG One or more arguments are invalid." 错误。_strOutput 也充满了一些随机字符.

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

有什么想法吗?

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

如果您尝试复制一个字符串,而不是将其连接起来,则有一个特殊函数可以为您执行此操作:StringCchCopy.

编辑:顺便说一句,如果您使用的是 API 的 TCHAR 版本(而您确实是),您应该将字符串声明为 TCHAR 数组(即LPTSTR 而不是 LPWSTR_T("") 而不是 L"")。这将使您的代码至少保持适度的可移植性。

字符串 copy/concat 函数查找空终止符以了解 copy/concat 到哪里。您需要将 _strOutput 的第一个元素初始化为零,以便缓冲区以 null 终止,然后您可以 copy/concat 根据需要为其赋值:

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

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

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

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

ZeroMemory(array, size of array in bytes)

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

ZeoMemory(str, 100 * sizeof (WCHAR))

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

正如其他答案所说,简单地将字符串的第一个字符设置为零对于字符串来说就足够了。您的选择。

也只是为了确保:您是否阅读了其他问题的其他答案?它们更适合您尝试执行的任务(而且我对流程一无所知 APIs;我只是查看了文档以获取答案)。