wstring型の文字列格納場所って?

[戻る]
敬一郎 2008/04/09(水) 14:08:39
wstring valBuff;
RegQueryValueEx( hkey, L"TestKey", NULL, NULL, (LPBYTE)valBuff, &Size  );

wstring型のvalBuff変数にレジストリから取得した値を入れたいのですが、
上記のようにしても、valBuffでコンパイルが通りません。

そこでwstring型の文字列格納場所のアドレスを取得したいのですが
どのように行えば良いか教えてください。

コンパイラはVisualStudio2005を使用しています。

シャノン 2008/04/09(水) 14:22:05
wstring から内部領域のポインタを得て Win32 API に渡すことはできません。
malloc 等のメモリ確保手段を用いるなり、vector< char > をバイト配列の代わりに使う
なりして一旦データを得てから、それを wstring に変換することになります。

敬一郎 2008/04/09(水) 14:27:00
[[解決]]
既存ソースの文字列操作が、すべてwstring型を使用していたので
合わせてwstring型を使いたかったのですが。。。
案外不便なのですね。

素直にWCHAR配列なりCStringなりを使って作成しようと思います。
回答ありがとうございました。

επιστημη [HomePage] 2008/04/09(水) 14:37:17
文字列の長さが0でないならば:

wstring valBuff(N,L'\0'); // Nは十分大きな値
RegQueryValueEx( hkey, L"TestKey", NULL, NULL, (LPBYTE)&valBuff[0], &Size  );

敬一郎 2008/04/09(水) 15:26:19
επιστημηさん。

そのやり方で無事値を取得できました。
わざわざローカルに格納用変数を作らなくて済みました。
ありがとうございます。

申し訳ないのですが、質問があります。

>valBuff(N,L'\0'); // Nは十分大きな値
これはN分の文字領域の確保(上なら\0詰め)という
認識でよろしいでしょうか?

>&valBuff[0]
これは、どこのアドレスを指定しているのでしょうか?


大変お手数かと思いますが、回答をいただけると助かります。
よろしくお願いします。

επιστημη [HomePage] 2008/04/09(水) 15:36:08
>>valBuff(N,L'\0'); // Nは十分大きな値
>これはN分の文字領域の確保(上なら\0詰め)という
>認識でよろしいでしょうか?

L'\0'がN個並んだ領域をwstringの内部バッファとします。

>>&valBuff[0]
> これは、どこのアドレスを指定しているのでしょうか?

wstringの内部バッファの先頭

敬一郎 2008/04/09(水) 15:43:46
回答ありがとうございます。
その情報を持って18時から初レビューに行ってきます。

YuO [E-Mail] 2008/04/09(水) 16:00:50
一応,どんなstd::wstringの実装でも問題なくするなら,
std::vector<wchar_t> buff(N);
RegQueryValueEx( hkey, L"TestKey", NULL, NULL, (LPBYTE)&buff[0], &Size  );
std::wstring val(&buff[0]);
かなぁ。

std::vectorは内部のバッファが連続している事を保証する記述がISO/IEC 14882:2003か
らあるけれど,std::basic_stringは記述がないし。
# 不連続を許すからこそ,c_str()とかdata()とかの呼び出しでポインタが無効になるの
だと思っています。

επιστημη [HomePage] 2008/04/09(水) 17:09:46
...あれ? vectorとbasic_stringについては内部バッファがリニアだって
どこぞのRationaleに明記されてた気が... 僕の思い違いかもしんないす。

yoh2 [E-Mail] 2008/04/12(土) 12:14:44
VC++自体とは少し離れますし、釈迦に説法な気もしますが。

basic_string<T>型の変数strについて、str[pos]の定義がstr.data()[pos]となっていますから、
ここから、&str[pos] (非const版) は連続していると言えるのではないでしょうか?
data()で得られたポインタは、非constなメンバ関数呼び出しの後に無効になりますが、
仮に非const版のoperator[]の呼び出し時にも無効になるとしたら、str[pos] (非const版) 自体
いきなり無効になって、文字を参照することができないはずです。
とはいえ、operator[]の定義自体、
http://www.open-std.org/JTC1/SC22/WG21/docs/lwg-defects.html#259
でツッコミ入っているのですが。

# 安全側に振ってstd::vector<T>を介する、という方針には賛成です。

古いスレッドには追加発言できません。