美文网首页
注册表REG_MULTI_SZ多字符串类型换行处理总结

注册表REG_MULTI_SZ多字符串类型换行处理总结

作者: ljchengx | 来源:发表于2022-04-20 10:36 被阅读0次

    C++ 操作注册表设置REG_MULTI_SZ多字符串类型数据

    需求

    部分电脑的DHCP相关注册表设置缺失,会导致一些列网络使用中的问题,需要修复相关注册表设置,由于value是REG_MULTI_SZ多字符模式,使用C++来处理时需要注意处理的方式。

    关键点

    ::RegSetValueExA() 方法最后两个参数的处理
    

    举例

    现在需要对注册表"SYSTEM\CurrentControlSet\Services\Dhcp"中的一个子类"DependOnService"设置一个多字符类型的值,多字符类型如下图所示: image.png 所以可以知道我们需要设置的字符串数据分别是“Nsi”、"Tdx"、"Afd",此时我们需要构建这样一个字符串,经过查阅官方文档的信息可知 image.png 需要关键“\0”来标识单个字符的结尾,同时在整个字符结束后还要再加一个“\0”来标识整个字符串结束。所以我们需要设置的字符串经过处理后可以得到:
    const char k_value[] = "Nsi\0Tdx\0Afd\0\0";
    
    此时关键点的参数我们已经解决一个了,还有第二个参数计算大小,这里也需要注意: image.png

    所以我们通过std::string来做一个调整,方便处理。

    string szs(k_value, sizeof(k_value) / sizeof(char)); //将char[]转换为std::string
    

    由于已经转成了std::string,第一个参数要处理为

    reinterpret_cast<const BYTE*>(&szs[0])
    

    下面放上关键代码,注意当前数据类型为:REG_MULTI_SZ

    string szs(k_value, sizeof(k_value) / sizeof(char));
    res = ::RegSetValueExA(hkey, key.c_str(), 0, REG_MULTI_SZ, reinterpret_cast<const BYTE*>(&szs[0]), szs.size());
    if (res != ERROR_SUCCESS) 
        return false;
    

    总结

    REG_MULTI_SZ 多字符串注意分隔符:"\0",结尾也不能忘记,还要注意字符串大小,防止只设置成功一个字符。
    以上代码已经同步gitee、https://gitee.com/ljchengx/repair-tools 如有需要可自行查阅。

    相关文章

      网友评论

          本文标题:注册表REG_MULTI_SZ多字符串类型换行处理总结

          本文链接:https://www.haomeiwen.com/subject/nctvertx.html