Использование, StringCchCat

Я пытаюсь использовать 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

Решение

Строковые функции копирования / concat ищут нулевые терминаторы, чтобы знать, куда копировать / concat. Вам нужно инициализировать первый элемент _strOutput в ноль, так что буфер завершается нулем, тогда вы можете скопировать / конкатать значения в него по мере необходимости:

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

Другие решения

Если это часть цикла, простой *_strOutput = 0; исправит вашу проблему.

Если вместо этого вы пытаетесь скопировать строку, а не объединить ее, есть специальная функция, которая сделает это за вас: StringCchCopy.

Редактировать: в качестве отступления, если вы используете TCHAR версия API (и вы), вы должны объявить свои строки как TCHAR массивы (то есть LPTSTR вместо LPWSTR, а также _T("") вместо L""). Это сохранит ваш код, по крайней мере, слегка переносимым.

2

Я пишу этот ответ, чтобы уведомить вас (поэтому вы видите красный 1 в верхней части любой страницы переполнения стека), потому что у вас вчера была такая же ошибка (в окне вашего сообщения), и теперь я понимаю, что вчера пренебрег этим.

Имейте в виду, что new[] оператор на встроенном типе, как WCHAR или же int НЕ инициализирует данные вообще. Память, которую вы получите, будет содержать любой мусор до вызова new[]Что бы это ни было. То же самое происходит, если вы говорите WCHAR x[100]; в качестве локальной переменной. Вы должны быть осторожны, чтобы инициализировать данные перед их использованием. Компиляторы обычно хорошо предупреждают вас об этом. (Я считаю, что у объектов C ++ есть свои конструкторы, вызываемые для каждого элемента, поэтому тот не даст вам ошибки … если вы не забудете что-то инициализировать в классе, конечно. Прошло много времени.)

Во многих случаях вы хотите, чтобы все было нулями. '\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 процессов; я только что проверил документы на мой ответ).

1
По вопросам рекламы [email protected]