【发布时间】:2010-10-25 08:53:32
【问题描述】:
我有一个获取 std::string 的函数。该函数调用
第 5 个参数是注册表值,需要一个 const BYTE* 类型的变量。 所以我必须将 std::string 转换为 const BYTE* 并将结果数组的长度作为第 6 个参数。
我找到了一种方法,但感觉很难看,我真的不明白发生了什么。这是该功能的精简版:
void function(const std::string& newValue)
{
HKEY keyHandle;
if(RegOpenKeyEx(HKEY_CLASSES_ROOT, TEXT("some key"),0,KEY_ALL_ACCESS,&keyHandle) == ERROR_SUCCESS)
{
std::wstring wNewValue;
wNewValue.assign(newValue.begin(),newValue.end());
if (RegSetValueEx(keyHandle, TEXT("some value"), NULL, REG_SZ, (const BYTE*)(LPCTSTR)(wNewValue.c_str()), wNewValue.size()*2)==ERROR_SUCCESS)
{
//do something
}
RegCloseKey(keyHandle);
}
}
如您所见,我首先制作一个宽字符串(定义了UNICODE),然后使用双重转换,并且对于长度我必须做*2,否则它只会设置输入字符串的一半。
这种形式的演员表是正常/最好的方式吗?
为什么是* 2,有什么更好的方法?
【问题讨论】:
-
由于你使用了wstring,你知道底层类型是wchar_t,c_str()会返回wchar_t*。所以不需要转换为 LPCTSTR。
标签: c++ windows winapi stl registry