2011-11-14 16 views
1

構造体でベクトルを埋めたい場合は、構造体内でWCHAR配列を動的に割り当て/再配置する必要がありますが、どのように配置すればよいでしょうか?
std::wstringを使用することはできません。これは、Windows APIでメンバーを使用するためです。 RegQueryValueExのような機能では、データを受信するにはLPBYTEが必要です。動的に割り当てられたメンバを持つ構造体のベクトル

他のSTLコンテナを使用する必要がありますか?

コード例:

typedef struct { 
    WCHAR *str1; 
    WCHAR *str2; 
    DWORD SomeOtherStuff; 
} MYSTRUCT; 

vector<MYSTRUCT> myvector; 
+1

私はあなたのデザインがひどいと信じる理由はいくつかあります。あなたが取ることを決定したこの非常に疑わしい最初のステップについてではなく、根底にある問題について質問してみませんか? –

+0

Kerrekが曖昧に言及しているのは、 'RegQueryValueEx'はあなたのためにバッファを割り当てないということです。あなたの現在の構造体では、他のものの中では安全でないヒープ割り当てが必要です。より大きな問題は、特定の問題がレジストリからのそのような可変量のデータを必要とするかどうかです。 – AJG85

+0

さて、私はレジストリでキーを列挙するつもりですが、List-Viewコントロール(Windows API)でユーザーに表示するためにいくつかの値を保存します。 – Josh

答えて

2

構造メンバーにはstd::vector<WCHAR>を使用してください。これにより、構造体に必要なコピー/移動セマンティクスをvectorに入れることができます。また、いくつかのAPIのローポインタが必要な場合は、&str1[0]として利用できます。

データにアクセスするすべての操作を行う前に、十分な大きさ(必要なサイズに初期化するか、またはresize()を呼び出して)を確認してください。また、ベクトルのサイズを変更すると、データへのポインタやイテレータは無効になることに注意してください。

+0

何か間違っていない限り、 'resize'や' reserve'を使わなければならないことに注意してください。 – Josh

+0

@ジョシュ:はい、あなたはそれがあなたがそれをする必要があるもののために十分な大きさであることを常に確認する必要があります。 –

+0

私は 'resize'や' reserve'を使うべきですか? – Josh

0

あなたは構造体のコピーコンストラクタ、代入演算子、およびデストラクタを定義することができます。そして、各インスタンスから作られたすべてのコピーは、動的に割り当てられたメモリの独自のコピーを持ちます。

それとも、単にstd::wstring

std::wstringあなたの根底にあるNULLで終わる文字列へのポインタを与えるアクセサメソッドc_strを、提供を使用することができます。これにより、C APIでstd :: wstringを使用できます。

std::wstring wide_string; 
some_win_api_call(wide_string.c_str()); // sending a string to winapi 

WINAPIから文字列を取得するには、自分自身をバッファリングし、バッファの長さと一緒に、バッファへのポインタを渡す割り当てる必要があります。

wide_string.reserve(256); // allocate some space to receive a string 
get_string_from_winapi(&wide_string[0], wide_string.capacity()); 

apiで長さをバイト数にしたい場合は、wide_string.capacity() * sizeof(wchar_t)とする必要があります。私の例では、長さを文字数と仮定しています。

+2

'wstring'のデータに非constポインタを得る方法はありません。これは、OPが必要と思うものです。それには 'vector 'が必要です。 –

+0

'reserve()'や '&string [0]'のようにハッキングすると、多くのコンパイラで動作するように見えても、未定義の振る舞いをすることに注意してください。最低限、 'reserve()'ではなく 'resize()'を使用して、将来の文字列操作が機能するようにしてください。 –

関連する問題