Реестр устанавливает 1 символ - PullRequest
1 голос
/ 16 января 2020

Мой код устанавливает 1 символ имени и значения реестра.

bool setRegValue(std::wstring valueName, std::wstring  valueToSet)
{
    HKEY key=NULL;
    if (get_HKEY_LOCAL_MACHINE(&key) && (key!=NULL))
    {

        if (RegSetValueEx((HKEY)key, (LPCSTR)valueName.c_str(), 0, REG_SZ, (const BYTE*)valueToSet.c_str(), (valueToSet.size() +1)*sizeof(wchar_t)) != ERROR_SUCCESS)
        {
            RegCloseKey((HKEY)key);
            log.error("Failed to SET the registry value. Name : "+ std::string(valueName.begin(), valueName.end())+" Value : "+ std::string(valueToSet.begin(), valueToSet.end()));
            RegCloseKey(key);
            return false;
        }
        log.info("Successfully SET the registry value. Name : " + std::string(valueName.begin(), valueName.end()) + " Value : " + std::string(valueToSet.begin(), valueToSet.end()));
        RegCloseKey(key);
        return true;
    }
    return false;
}

И это метод вызова.

bool setServiceAsClient()
{ 
    if (setRegValue(L"ServiceType", L"Client"))
        return true;
    return false;
}

Устанавливает имя реестра как S И, значение как C

1 Ответ

1 голос
/ 16 января 2020

Когда строка с широким символом рассматривается как строка с 1 символом, это признак того, что вы предоставляете строку с широким символом, где ожидается многобайтовая строка.

Действительно, мы видим ошибка здесь: (LPCSTR)valueName.c_str() (где valueName - std::wstring).

LPCSTR - const char *, тогда как wstring::c_str() возвращает const wchar_t *.

Таким образом, L"ServiceType" рассматривается как "S\0e\0r\0v\0i\0c\0e\0T\0y\0p\0e\0", что становится просто "S"

Возможны 2 решения:

  1. Используйте std::string вместо std::wstring (и удалите L из строк, таких как L"ServiceType"). Это решение не рекомендуется, поскольку внутренним Win32 API является Unicode.
  2. Измените настройки проекта с Многобайтовые на Набор символов Unicode и удалите приведение к LPCSTR (если вам нужно выполнить приведение, используйте LPTSTR вместо этого, что всегда соответствует настройкам набора символов проекта).

См. Работа со строками - Win32 API для получения дополнительной информации.

...