CString⇒LPTSTR変換

基本的な事ですが、CStringは便利ですのでよく使いますが、_tcstok_sなど、w_char_t*( 読み取り専用でない)を引数にとる関数があった場合に、LPTSTRに変換したい場合があります。LPCTSTRであればCStringから直接キャストすればよいだけですが、LPTSTRに変換して修正したい場合がよくあるのですが忘却する為、掲載します。

  • CString⇒LPTSTR変換
// CString変数
CString strTest = _T("TEST");

// GetBufferにてメモリを確保しLPTSTRにキャスト
LPTSTR strCast = strTest.GetBuffer();

// キャストしたstrCast変数を引数に関数呼び出し
CString strTest2 = _tcstok_s(strCast, sSeps, &sNext);

// ReleaseBufferを呼び出し(内部的な CString 状態情報を更新)
strTest.ReleaseBuffer();

今回は、GetBuffer,ReleaseBufferを利用した方式としています。注意点はまれに私もあるのですが、ReleaseBufferを書き忘れる事です。容赦なくメモリリークします。また、 ReleaseBufferの前に、CStringの別関数を呼び出さないようにしましょう。メモリの再確保によりGetBufferのポインタが無効になります。
尚、LPCTSTR (const)にキャストしたい場合はCStringは直接キャストできます。

※CStringは動的にメモリを確保してくれるので、文字列操作としては非常に便利なのですが、結局最後はメモリ、ポインタを意識しないと簡単にメモリリークして苦しむ事になる為、気を付けたいところです。

Leave a Reply

Your email address will not be published. Required fields are marked *