我正在编写一个用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;
}
当我尝试用keyname替换“XXXXXXXX”时,它给了我一个错误。如何在RegSetValueEx()中传递keyname的值?
答案 0 :(得分:4)
您需要使用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
相同的任务。