При добавлении значения в реестр в конце значения ставятся три точки

char* ccometa = new char[cometa.length() + 1];
    strcpy(ccometa, cometa.c_str());
    TCHAR Tccometa[512];
    _tcscpy(Tccometa, ccometa);
    HKEY hKeys;
    if (ERROR_SUCCESS == RegCreateKeyEx(HKEY_CURRENT_USER, "SuperData\\command", 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hKeys, NULL))
    {
        RegSetValueEx(hKeys, _T(""), 0, REG_SZ, (BYTE*)Tccometa, sizeof(Tccometa));
        RegCloseKey(hKeys);
    }

P.s. проект сделан в visual studio 2019,используется многобайтовая кодировка. И если не делать такие манипуляции:

char* ccometa = new char[cometa.length() + 1];
    strcpy(ccometa, cometa.c_str());
    TCHAR Tccometa[512];
    _tcscpy(Tccometa, ccometa);

То в реестр будут записываться непонятные символы. Сам string cometa:

std::string appdata = getenv("APPDATA");//получить папку appdata
std::string cometa = appdata + "\\" += userd4t4.dat;

Ответы (1 шт):

Автор решения: V-Mor

sizeof(Tccometa) всегда возвращает 512, потому что данная функция возвращает размер памяти, выделенной ВСЕЙ данной переменной, вне зависимости, сколько из этих байт занято полезной информацией, а сколько пустует.

Предлагаю Вам использовать (strlen(Tccometa) + 1) * sizeof(TCHAR) вместо этого. Данная конструкция вернёт длину записываемой строки + 1 символ в байтах. Дополнительный символ использован, чтобы учесть символ конца строки (в документации к RegSetValueEx написано, что он должен быть учтён). Умножение на sizeof(TCHAR) используется, т.к. байтовая длина TCHAR может меняться.

Таким образом, Ваш код примет следующий вид:

char* ccometa = new char[cometa.length() + 1];
strcpy(ccometa, cometa.c_str());
TCHAR Tccometa[512];
_tcscpy(Tccometa, ccometa);
HKEY hKeys;
if (ERROR_SUCCESS == RegCreateKeyEx(HKEY_CURRENT_USER, "SuperData\\command", 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hKeys, NULL))
{
    RegSetValueEx(hKeys, _T(""), 0, REG_SZ, (BYTE*)Tccometa, (_tcslen(Tccometa) + 1) * sizeof(TCHAR));
    RegCloseKey(hKeys);
}

И кстати, если уж Вы используете TCHAR, используйте функции работы со строками и сами строки, устойчивые к изменению типа TCHAR. TCHAR может определяться как char или как wchar_t. Во втором случае у Вас сломаются strcpy и char* ccometa = new char[cometa.length() + 1];, работающие только с char, но не с wchar_t. В таком случае я посоветовал бы Вам везде перейти к TCHAR, а strcpy заменить на _tcscpy. std::string тогда заменится на std::basic_string<TCHAR>. Возможно придётся произвести ещй ряд замен. Чтобы проверить, будет ли всё работать в случае, если TCHAR определится как wchar_t, просто добавьте #define UNICODE в начало программы. А вообще, лучше подумайте, так ли Вам сильно нужен этот TCHAR.

→ Ссылка