C++ std::字符串到LPBYTE和RegEnumValueA

C++ std::字符串到LPBYTE和RegEnumValueA,c++,registry,type-conversion,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); 字符串名; 字符串值; RegEnumValueA(hKey,0,常量转换(Na

将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);
字符串名;
字符串值;
RegEnumValueA(hKey,0,常量转换(Name.c_str()),&dwSize,NULL,NULL,(LPBYTE)常量转换(Value.c_str()),&dwSize2);

当我尝试使用这段代码时,字符串名称的一切都正常,但是字符串值中有一个错误的指针

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

使用字符缓冲区而不是
字符串
s。这是一个很好的例子,康斯特演员完全没有必要

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);

使用所需数据获取
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);

如果你真的想“代码”<代码> STD::String ,正如你所说的,你可以考虑下面的代码。据我所知,它应该适用于任何

std::string
实现,但仍然有点“黑客”,我不推荐它

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);
字符串名(1024,”);
字符串值(1024,,);
DWORD dwSize=Name.size();
DWORD dwSize2=Value.size();
RegEnumValueA(hKey,0,常量转换(&名称[0]),&dwSize,NULL,NULL,(LPBYTE)常量转换(&值[0]),&dwSize2);

您无法写入由
c_str()
检索的缓冲区。您可以将
&Value[0]
与c++11一起使用,但我认为您最好使用
vector
。不过,如果选择字符串,请确保不要覆盖空字符。这很好,直到您需要在运行时决定缓冲区的使用方式。在这一点上,
vector
就是答案。为什么你更喜欢新的而不是vector?!您的字符串构造需要第二个迭代器,而不是大小。但是这是不正确的,因为从RegEnumValueA返回的字符串以null结尾,“size1”和“size2”字段保持不变。因此我修改了strin结构。哦,我错了。我习惯于用迭代器对构造容器,因为我不认为其他任何容器使用迭代器和大小。出于某种原因,我也忘记了以null结尾的字符串构造函数。从注册表函数返回的字符串不保证以null结尾。通过输入一个不包含空字符的值,很容易看到这种情况。谢谢,这似乎是我想要的最好的方法:)