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 如有需要可自行查阅。
网友评论