wstring valBuff;
RegQueryValueEx( hkey, LTestKey, NULL, NULL, (LPBYTE)valBuff, &Size );
wstring型のvalBuff変数にレジストリから取得した値を入れたいのですが、
上記のようにしても、valBuffでコンパイルが通りません。
そこでwstring型の文字列格納場所のアドレスを取得したいのですが
どのように行えば良いか教えてください。
コンパイラはVisualStudio2005を使用しています。
wstring から内部領域のポインタを得て Win32 API に渡すことはできません。
malloc 等のメモリ確保手段を用いるなり、vector< char > をバイト配列の代わりに使う
なりして一旦データを得てから、それを wstring に変換することになります。
既存ソースの文字列操作が、すべてwstring型を使用していたので
合わせてwstring型を使いたかったのですが。。。
案外不便なのですね。
素直にWCHAR配列なりCStringなりを使って作成しようと思います。
回答ありがとうございました。
文字列の長さが0でないならば:
wstring valBuff(N,L'\0'); // Nは十分大きな値
RegQueryValueEx( hkey, LTestKey, NULL, NULL, (LPBYTE)&valBuff[0], &Size );
επιστημηさん。
そのやり方で無事値を取得できました。
わざわざローカルに格納用変数を作らなくて済みました。
ありがとうございます。
申し訳ないのですが、質問があります。
>valBuff(N,L'\0'); // Nは十分大きな値
これはN分の文字領域の確保(上なら\0詰め)という
認識でよろしいでしょうか?
>&valBuff[0]
これは、どこのアドレスを指定しているのでしょうか?
大変お手数かと思いますが、回答をいただけると助かります。
よろしくお願いします。
>>valBuff(N,L'\0'); // Nは十分大きな値
>これはN分の文字領域の確保(上なら\0詰め)という
>認識でよろしいでしょうか?
L'\0'がN個並んだ領域をwstringの内部バッファとします。
>>&valBuff[0]
> これは、どこのアドレスを指定しているのでしょうか?
wstringの内部バッファの先頭
回答ありがとうございます。
その情報を持って18時から初レビューに行ってきます。
一応,どんなstd::wstringの実装でも問題なくするなら,
std::vector<wchar_t> buff(N);
RegQueryValueEx( hkey, LTestKey, NULL, NULL, (LPBYTE)&buff[0], &Size );
std::wstring val(&buff[0]);
かなぁ。
std::vectorは内部のバッファが連続している事を保証する記述がISO/IEC 14882:2003か
らあるけれど,std::basic_stringは記述がないし。
# 不連続を許すからこそ,c_str()とかdata()とかの呼び出しでポインタが無効になるの
だと思っています。
...あれ? vectorとbasic_stringについては内部バッファがリニアだって
どこぞのRationaleに明記されてた気が... 僕の思い違いかもしんないす。
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>を介する、という方針には賛成です。