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

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

需求

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

关键点

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

举例

现在需要对注册表"SYSTEM\CurrentControlSet\Services\Dhcp"中的一个子类"DependOnService"设置一个多字符类型的值,多字符类型如下图所示:所以可以知道我们需要设置的字符串数据分别是“Nsi”、"Tdx"、"Afd",此时我们需要构建这样一个字符串,经过查阅官方文档的信息可知需要关键“\0”来标识单个字符的结尾,同时在整个字符结束后还要再加一个“\0”来标识整个字符串结束。所以我们需要设置的字符串经过处理后可以得到:

const char k_value[] = "Nsi\0Tdx\0Afd\0\0";

此时关键点的参数我们已经解决一个了,还有第二个参数计算大小,这里也需要注意:
所以我们通过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 如有需要可自行查阅。

posted @ 2022-04-20 10:55  CX先生  阅读(540)  评论(0编辑  收藏  举报