CString


危険性

スレッドセーフでない為、マルチスレッドで文字列を扱う場合、可能な限りSTLのstring型かwstring型を使う方がよい。
ローカル変数の場合などは問題はないが、classやtypedef内の変数に宣言すると、上記危険性が増加する。
よって、CStringには文字コードの互換性等の便利な機能が存在するので、共通データや常に存在するデータなどに用いるのではなく、それらの機能を活かす為に、一時的に使用するのが適切である。
TOP

ユニコード文字列とマルチバイト文字列の互換性

共通 ユニコード マルチバイト
CString(WCHAR* or CHAR*) CStringW(WCHAR*) CStringA(CHAR*)
例)
CStringA mbStr = "マルチバイト";
CStringW wStr = L"ユニコード";

mbStr += wStr;  // マルチバイト文字列に変換
wStr += mbStr;  // ユニコード文字列に変換
TOP

文字列⇒数値

Shell Utility APIの「::StrToIntEx()」を使用する。
Shell Utility API実装方法

例)10進数の場合
CString str = _T("123");
int nDec = 0;
::StrToIntEx(str, STIF_DEFAULT, &nDec);
TOP

数値⇒文字列

CString::Format()を使用する。
例)
int num = 101;
CString str = _T("");
str.Format("%d", i);
ASSERT(str == "101");
TOP

CStringにおける文字列領域(ポインタ)へのアクセス方法

LPTSTRとCStringの間などで、データのやり取りする場合に必要になる。同じ型同士なら、簡単なのですが...

読み取りのみの場合

例)
LPTSTR pszText = NULL;
CString str = _T("おはよう");
pszText = const_cast<LPTSTR>(static_cast<LPCTSTR>(str));
本来、読み取り用を無理やり書き込み可能にしてるので、書き込みには使わないこと!

書き込みの場合

例)
CString str = _T("おはよう");
LPTSTR pszText = str.GetBuffer(256);
_tcscpy_s(pszText, 256, _T("こんばんわ"));
TRACE(_T("str.GetLength() = %d\n"), str.GetLength());
str.ReleaseBuffer( );  
TRACE(_T("str.GetLength() = %d\n"), str.GetLength());
ReleaseBuffer()は忘れないこと!
実行結果)
str.GetLength() = 4
str.GetLength() = 5
TOP

_T()


_T() を利用したほうが、無難。
TOP

コメント


名前:
コメント:
TOP

最終更新:2010年11月08日 19:35
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。