Я пытаюсь объединить 2 тчар.
char username[UNLEN+1];
DWORD username_len = UNLEN+1;
GetUserName(username, &username_len);
TCHAR* appdatapath ="C:\\Users\\"+username+"\\AppData";
Но я получаю сообщение об ошибке в строке appdatapath. Как я могу комбинировать 2 tchar? Спасибо
Посмотри на strcat а также wcscat. Вы не можете добавить указатель на символ с массивом символов.
Если вы находитесь на машине с Windows, вы можете использовать _tcscat
который перенаправит на нужную функцию для использования в зависимости от _UNICODE
а также _MBCS
определяет.
Возможно, вы захотите использовать безопасные версии, добавив _s к имени функции.
Как указано в комментариях, вы также можете использовать snprintf следующим образом:
const size_t concatenated_size = 256;
char concatenated[concatenated_size];
snprintf(concatenated, concatenated_size, "C:\\Users\\%s\\AppData", username);
Поскольку у вас есть строковые литералы до и после строки времени выполнения, это, вероятно, лучший подход.
Чтобы ответить на вопрос в заголовке: вы объединяете два TCHAR
строки с использованием _tcscat
функция.
Однако в вашем коде есть другие проблемы, связанные с этим: GetUserName
ожидает LPTSTR
то есть указатель на буфер TCHAR
персонажи. Кроме того, есть еще один TCHAR
использование в
TCHAR* appdatapath ="C:\\Users\\"+username+"\\AppData";
Проблема в том, что тип, к которому TCHAR
расширяет изменения в зависимости от того, _UNICODE
определено. В частности, если вы установите его, TCHAR
(в конце концов) расширяется до wchar
и поэтому GetUserName
ожидает wchar_t*
но вы передаете char*
, Другая проблема заключается в том, что вы не можете объединять массивы C, используя +
оператор.
Предлагаю перестать беспокоиться о TCHAR
во-первых, и всегда просто компилировать с _UNICODE
определены — и использовать wchar
по всему вашему коду. Кроме того, поскольку вы используете C ++, просто используйте std::wstring
:
wchar username[UNLEN+1];
DWORD username_len = UNLEN+1;
GetUserNameW(username, &username_len);
std::wstring appdatapath = L"C:\\Users\\";
appdatapath += username;
appdatapath += L"\\AppData";
И последнее, но не менее важное: весь ваш код, вероятно, можно заменить вызовом SHGetSpecialFolderPath
функция — пройти CSIDL_APPDATA
к нему, чтобы получить путь «AppData».
#include <tchar.h>
const size_t stringSize= 20;
TCHAR value[stringSize] = { 0 };
_tcscat_s(value, stringSize, TEXT("appendMe"));
MSDN: _tcscat_s