CStringをBYTE*に変換するには?

[戻る]
ABC 2016/03/17(木) 14:09:32
CString型の文字列CStringでもつ文字列を以下の構造体に正しく入れるには、どのように
実装したらよろしいでしょうか?
また構造体"test_t"のszはNULL終端付きのサイズを入れ、bufには文字列を入れる仕様と
なっています。

構造体の定義:
typedef    struct    {
    size_t    sz;
    BYTE    *buf;
}    test_t;


ソースは次のように書きましたが、正しいでしょうか? ご教示いただきたくよろしくお
願いいたします。
===
CString str = "QWE";
test_t stTest;

stTest.sz = str.GetLength();
stTest.buf = (BYTE*)strValue.GetBuffer();
===

仲澤@失業者 2016/03/18(金) 16:50:30
「CString」class はコンパイル時の設定によって

 (1)CStringA : MBCS(=ASCII)文字列、
 (2)CStringW : Unicode文字列

のどちらかに置き換えられます。従って、

stTest.buf = (BYTE*)str.GetBuffer();

の行は、(1)の場合のみ正しく動作します。
(2)の場合は正しくありません。
(2)の場合に正しく動作させるためには

CStringA  StrMBCS( str);  // Uncode => MBCS
stTest.sz  = StrMBCS.GetLength();
stTest.buf = ( BYTE *)StrMBCS.GetBuffer();

の様に一旦MBCS文字列に変換する必要があります。

また、
CStringA::GetLength()はバイト数を戻しますが、
CStringW::GetLength()は文字数を戻す
とい違いもあるので注意しましょう。
つまりMBCSに変換後に実行しないと異なる数値が戻る可能性があるわけですね。

AR 2016/03/19(土) 01:42:00
文字コード類は、解説されてるので割愛しますがMBCSと仮定した場合
stTest.sz = str.GetLength()+1;
ですかね。
終端コードの分も足しておく必要があると思います。

瀬戸っぷ [E-Mail] 2016/03/21(月) 21:05:44
例として書いている場合なら寿命的には大丈夫かと思いますが…

寿命が異なる場合に問題になる…かも知れないって部分は大丈夫なんですかね?
ReleaseBufferュョとの関係とか…。

malloc()なりして、コピーするものかと思いましたけど。

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