我正在尝试通过RegSetValueEx
向Windows注册表写入一些值,但是,值以“日语形式”保存。
例如:
在十六进制编辑器中查看文本时,文本看起来是正确的值,但前缀为“FF FE”,这似乎是一个字节顺序标记。
保存值的代码如下:
RegSetValueEx(
RegistryUtils::registryKey,
L"test",
0,
REG_SZ,
(unsigned char*)config.getTestValue().c_str(),
strlen(config.getTestValue().c_str()) + 1
);
其中config.getTestValue()
返回std::string
类型。
如何防止“FF FE”被添加到所需的字符串之前?
答案 0 :(得分:0)
RegSetValueExW
的字符串数据需要是宽文本,size参数需要是字节数,包括终止零。
这很好用:
#undef UNICODE
#define UNICODE
#include <windows.h>
#include <string.h> // strlen
namespace RegistryUtils
{
auto const registryKey = HKEY_CURRENT_USER;
};
auto main()
-> int
{
wchar_t const* const s = L"blah";
RegSetValueEx(
RegistryUtils::registryKey,
L"test",
0,
REG_SZ,
reinterpret_cast<BYTE const*>( s ),
sizeof(wchar_t)*(wcslen(s) + 1)
);
}
阅读the documentation有问题的功能是个好主意。
答案 1 :(得分:0)
您正在调用RegSetValueEx()
的Unicode版本,该版本需要UTF-16格式的字符串数据,但您要传递Ansi数据。将您的数据放入std::wstring
而不是std::string
,同时请记住RegSetValueEx()
对字节进行操作,而不是字符:
std::wstring value = config.getTestValueW(); // <-- for you to implement
RegSetValueEx(
RegistryUtils::registryKey,
L"test",
0,
REG_SZ,
(BYTE*) value.c_str(),
(value.length() + 1) * sizeof(WCHAR)
);