При добавлении значения в реестр в конце значения ставятся три точки
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 шт):
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.