CStringをBYTE*に変換するには? – プログラミング – Home

CStringをBYTE*に変換するに...
 
通知
すべてクリア

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


ABC
 ABC
(@ABC)
ゲスト
結合: 23年前
投稿: 16
Topic starter  

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();
===


引用解決済
トピックタグ
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

「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に変換後に実行しないと異なる数値が戻る可能性があるわけですね。


返信引用
AR2
 AR2
(@ar2)
Estimable Member
結合: 5年前
投稿: 110
 

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


返信引用
瀬戸っぷ
 瀬戸っぷ
(@瀬戸っぷ)
ゲスト
結合: 18年前
投稿: 178
 

例として書いている場合なら寿命的には大丈夫かと思いますが…

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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