Rau*_*Lam 5 c++ windows winapi
我正在编写一个程序来通过 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;
}
Run Code Online (Sandbox Code Playgroud)
当我尝试用键名替换“XXXXXXXX”时,它给了我一个错误。如何在 RegSetValueEx() 中传递键名的值?
您需要改用该std::wstring类型。这将为您提供基于wchar_t类型的宽 (Unicode) 字符串,这是 Windows 在内部存储字符串的方式。
然后,您可以简单地使用c_str()成员函数来检索指向 C 样式字符串的指针,并将其直接传递给RegSetValueEx函数。所述size()成员函数给你字符串,它可以传递为长度cbData参数,除了两个警告:
cbData期望字符串的长度包含终止 NUL 字符,因此您需要将size().cbData期望字符串的大小(以字节为单位),而不是字符数,因此对于宽字符串,您需要将返回的值乘以size()a 的长度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);
}
Run Code Online (Sandbox Code Playgroud)
如果你绝对必须使用窄(ANSI)字符串(你不应该,因为你在这里直接与操作系统交互,而不是处理用户数据),你可以做同样的事情,但显式调用 ANSI 版本的RegSetValueEx, 有一个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);
}
Run Code Online (Sandbox Code Playgroud)
在内部,RegSetValueExA将字符串转换为 Unicode,然后执行与RegSetValueExW.
| 归档时间: |
|
| 查看次数: |
2470 次 |
| 最近记录: |