wstring型の文字列格納場所って? – プログラミング – Home

wstring型の文字列格納場所って?
 
通知
すべてクリア

[解決済] wstring型の文字列格納場所って?


敬一郎
 敬一郎
(@敬一郎)
ゲスト
結合: 17年前
投稿: 4
Topic starter  

wstring valBuff;
RegQueryValueEx( hkey, LTestKey, NULL, NULL, (LPBYTE)valBuff, &Size );

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

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

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


引用未解決
トピックタグ
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

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


返信引用
敬一郎
 敬一郎
(@敬一郎)
ゲスト
結合: 17年前
投稿: 4
Topic starter  

既存ソースの文字列操作が、すべてwstring型を使用していたので
合わせてwstring型を使いたかったのですが。。。
案外不便なのですね。

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


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

文字列の長さが0でないならば:

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


返信引用
敬一郎
 敬一郎
(@敬一郎)
ゲスト
結合: 17年前
投稿: 4
Topic starter  

επιστημηさん。

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

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

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

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

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


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

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

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

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

wstringの内部バッファの先頭


返信引用
敬一郎
 敬一郎
(@敬一郎)
ゲスト
結合: 17年前
投稿: 4
Topic starter  

回答ありがとうございます。
その情報を持って18時から初レビューに行ってきます。


返信引用
YuO
 YuO
(@YuO)
ゲスト
結合: 22年前
投稿: 320
 

一応,どんな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()とかの呼び出しでポインタが無効になるの
だと思っています。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

...あれ? vectorとbasic_stringについては内部バッファがリニアだって
どこぞのRationaleに明記されてた気が... 僕の思い違いかもしんないす。


返信引用
yoh2
 yoh2
(@yoh2)
ゲスト
結合: 18年前
投稿: 70
 

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>を介する、という方針には賛成です。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました