Реестр устанавливает 1 символ

Мой код устанавливает 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 символом, это признак того, что вы предоставляете строку с широким символом, где ожидается многобайтовая строка.

На самом деле ошибка здесь: (LPCSTR)valueName.c_str() (где valueName является std::wstring ).

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

Таким образом, L"ServiceType" рассматривается как "ServiceType" , который становится просто "S"

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

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

Есть идеи?

10000