Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 注册表正在设置1个字符_C++_Windows_Registry - Fatal编程技术网

C++ 注册表正在设置1个字符

C++ 注册表正在设置1个字符,c++,windows,registry,C++,Windows,Registry,我的代码设置了注册表名和值的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_

我的代码设置了注册表名和值的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字符字符串时,这表明您在需要多字节字符串的地方提供了宽字符字符串

实际上,我们在这里看到了错误:
(LPCSTR)valueName.c_str()
(其中
valueName
是一个
std::wstring

LPCSTR
常量字符*
,而返回
常量字符*

因此
L“ServiceType”
被视为
“S\0e\0r\0v\0i\0c\0e\0T\0y\0p\0e\0”
,它变成了
“S”

有两种可能的解决方案:

  • 使用
    std::string
    代替
    std::wstring
    (并从
    L“ServiceType”
    等字符串中删除
    L
    )。不建议使用此解决方案,因为Win32 API内部是Unicode
  • 将项目设置从多字节更改为Unicode字符集,并将强制转换删除为
    LPCSTR
    (如果确实需要强制转换,请改用始终与项目字符集设置匹配的
    LPTSTR

  • 有关详细信息,请参阅。

    您的问题是什么?它不起作用吗?它以什么方式不起作用?您是否收到错误消息和/或错误代码?我们是否应该为该答案找到正确的问题?什么是
    get\u HKEY\u LOCAL\u MACHINE
    RegSetValueEx
    应该是打开的注册表项的句柄,通常类似于
    HKLM\SOFTWARE\[Company]\blahblahblah
    函数名意味着它是
    HKLM
    本身。。。复制并粘贴,这是我使用的(不是Unicode,所以使用
    A
    version)
    val=RegSetValueEx(hKey,strValueName.c_str(),0,REG_SZ,(BYTE*)strValue.c_str(),(DWORD)strValue.size()+1)您的代码看起来基本相同,但针对Unicode进行了修改,因此没有看到任何偏离顶部的内容。基本原因与。演员们总是疑神疑鬼。我怀疑您收到了关于类型不匹配的编译器警告,但您没有解决不匹配问题,而是使用了强制转换来表示“相信我”。第三个常用的选项是直接使用宽字符或多字节函数名(例如,
    RegSetValueExW
    RegSetValueExA
    ),忘记
    TCHAR
    宏。一个程序不太可能以独立的宽字符和多字节版本分发。选择是由所需的库和跨平台需求确定的。在Windows 10中,多字节API可以是Unicode(UTF-8),但有些函数仍然只有宽字符API,既有“W”后缀(例如
    GetVolumeInformation ByHandlew
    ),也没有后缀(例如
    GetFileInformationByHandleEx
    )。完美。感谢@rustyx的详细解释