std :: string到LPBYTE和RegEnumValueA

时间:2013-02-02 21:20:08

标签: c++ registry type-conversion

将std :: string强制转换为LPBYTE以使此代码正常工作的正确方法是什么?

string Name;
string Value;
RegEnumValueA(hKey, 0, const_cast<char*>(Name.c_str()), &dwSize, NULL, NULL, (LPBYTE)const_cast<char*>(Value.c_str()), &dwSize2);

当我尝试使用此代码时,everythins是字符串名称的okey,但字符串值中存在错误的指针错误

3 个答案:

答案 0 :(得分:1)

指针参数应指向将由函数修改的有效缓冲区。单位化字符串的c_str()不指向任何有效的字符串。

使用char缓冲区而不是string s。这是const_cast&lt;&gt;的一个非常好的例子。完全不必要的。

char Name[200], Value[200]; //Sizes are arbitrary
DWORD dwSize = sizeof(Name), dwSize2 = sizeof(Value);

RegEnumValueA(hKey, 0, Name, &dwSize, NULL, NULL, (LPBYTE)Value, &dwSize2);

答案 1 :(得分:0)

获取std::string所需数据的正确方法

//alloc buffers on stack
char buff1[1024];
char buff2[1024];

//prepare size variables
DWORD size1=sizeof(buff1);
DWORD size2=sizeof(buff2);

//call
RegEnumValueA(hKey, 0, buff1, &size1, NULL, NULL, (LPBYTE)buff2, &size2);

//"cast" to std::string
std::string Name(buff1);
std::string Value(buff2);

答案 2 :(得分:0)

如果确实想按照你的说法“投射”std::string,你可以考虑以下代码。它应该适用于我所知道的任何std::string实现,但它仍然有点“hacky”,我不推荐它。

string Name(1024, ' ');
string Value(1024, ' ');
DWORD dwSize=Name.size();
DWORD dwSize2=Value.size();

RegEnumValueA(hKey, 0, const_cast<char*>(&Name[0]), &dwSize, NULL, NULL, (LPBYTE)const_cast<char*>(&Value[0]), &dwSize2);