Я пытаюсь использовать 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.
Есть идеи?
Строковые функции копирования / concat ищут нулевые терминаторы, чтобы знать, куда копировать / concat. Вам нужно инициализировать первый элемент _strOutput
в ноль, так что буфер завершается нулем, тогда вы можете скопировать / конкатать значения в него по мере необходимости:
LPWSTR _strOutput = new wchar_t[100];
_strOutput[0] = L'\0`; // <-- add this
X = StringCchCat(_strOutput, 100, Y);
Если это часть цикла, простой *_strOutput = 0;
исправит вашу проблему.
Если вместо этого вы пытаетесь скопировать строку, а не объединить ее, есть специальная функция, которая сделает это за вас: StringCchCopy
.
Редактировать: в качестве отступления, если вы используете TCHAR
версия API (и вы), вы должны объявить свои строки как TCHAR
массивы (то есть LPTSTR
вместо LPWSTR
, а также _T("")
вместо L""
). Это сохранит ваш код, по крайней мере, слегка переносимым.
Я пишу этот ответ, чтобы уведомить вас (поэтому вы видите красный 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 лет WCHAR
s в его эквивалентное количество байтов.
Как говорят другие ответы, для строки достаточно установить нулевой первый символ строки. Твой выбор.
Также просто чтобы убедиться: вы читали другие ответы на другой вопрос? Они больше ориентированы на задачу, которую вы пытались выполнить (а я совсем не разбираюсь в API процессов; я только что проверил документы на мой ответ).