3

このコードを機能させるために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);

このコードを使用しようとすると、文字列名はすべて問題ありませんが、文字列値に不正なポインタエラーがあります

4

3 に答える 3

1

ポインターパラメーターは、関数によって変更される有効なバッファーを指している必要があります。単一化された文字列のc_str()は、有効なものを指していません。

sの代わりにcharバッファを使用しますstring。これは、const_cast<>がまったく要求されていない非常に良いケースです。

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);
于 2013-02-02T21:28:17.900 に答える
1

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);
于 2013-02-02T21:36:49.153 に答える
0

あなたが言ったように本当に「キャスト」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);
于 2013-02-02T21:46:23.300 に答える