gpt4 book ai didi

c++ - 如何在 C++ 中将 std::string 值传递给 RegSetValueEx()

转载 作者:可可西里 更新时间:2023-11-01 14:13:27 26 4
gpt4 key购买 nike

我正在编写一个程序来通过 C++ 编辑 Windows 注册表项,但是当我尝试将字符串值传递给库函数 RegSetValueEx() 时,有一个以 TEXT() 开头的文件,它只能是硬编码值.

我的部分代码:

string region;
string excelserver_type;
string keyname = region + excelserver_type;

if (RegSetValueEx(key64, TEXT("XXXXXXXXX"), 0, REG_SZ, (LPBYTE)TEXT("XXXXXXXXXX"), 100) != ERROR_SUCCESS)

{
RegCloseKey(key);
cout << "Unable to set registry value in HKEY_LOCAL_MACHINE\\Software" << endl;
}

当我尝试用键名替换“XXXXXXXX”时,出现错误。如何在 RegSetValueEx() 中传递键名的值?

最佳答案

您需要使用 std::wstring改为键入。这将为您提供一个基于 wchar_t 的宽 (Unicode) 字符串类型,这是 Windows 在内部存储字符串的方式。

然后,您可以简单地使用 c_str()成员函数检索指向 C 风格字符串的指针,并将其直接传递给 RegSetValueEx功能。 size()成员函数为您提供字符串的长度,您可以将其作为 cbData 传递参数,除了两个警告:

  • cbData期望字符串的长度包括终止 NUL 字符,因此您需要将 size() 返回的长度加 1 .
  • cbData期望字符串的大小以 bytes 为单位,而不是字符数,因此对于宽字符串,您需要乘以 size() 返回的值按 wchar_t 的长度.
bool SetStringValue(HKEY                hRegistryKey,
const std::wstring& valueName,
const std::wstring& data)
{
assert(hRegistryKey != nullptr);

return (RegSetValueExW(hRegistryKey,
valueName.c_str(),
0,
REG_SZ,
(LPBYTE)(data.c_str()),
(data.size() + 1) * sizeof(wchar_t)) == ERROR_SUCCESS);
}

如果你绝对必须使用窄 (ANSI) 字符串(你不应该,因为你在这里直接与操作系统交互,而不是处理用户数据),你可以做同样的事情,但显式调用RegSetValueEx 的 ANSI 版本, 它有一个 A后缀。这里,仍然需要将长度加1,但是字节大小等同于字符数,所以不需要缩放。

bool SetStringValue_ANSI(HKEY                hRegistryKey,
const std::string& valueName,
const std::string& data)
{
assert(hRegistryKey != nullptr);

return (RegSetValueExA(hRegistryKey,
valueName.c_str(),
0,
REG_SZ,
(LPBYTE)(data.c_str()),
data.size() + 1) == ERROR_SUCCESS);
}

在内部,RegSetValueExA会将字符串转换为 Unicode,然后执行与 RegSetValueExW 相同的任务.

关于c++ - 如何在 C++ 中将 std::string 值传递给 RegSetValueEx(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41439090/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com