CString から char* への変換
文字型にはいつも悩まされています。プログラミングの都合上、色んな表現の仕方があるみたいです。それらの違いや特徴を理解した上で、合理的な(ただ動けばいいというのではない)プログラミングをする必要があります。
文字列を引数に取る関数の引数の種類は以下の2通りがあります。
- char*型
引数に渡した変数を書き換える関数 - const char*型
引数に渡す変数は読み取り専用でそれを使ってある操作をする関数
2.の読み取り専用の引数の場合、CString型の変数をconst char*型で定義した引数にそのまま渡すことができます。これはCStringに備わっている機能として「CStringからconst char*型へのキャストが自動的に呼んで、LPCSTR型に変換する」というものがあるからです。
一方、1.の場合は注意を要します。
C++言語で用いるCString型文字列は、どんな長さの文字列でも適切にメモリ領域を確保してくれるというとても便利な型です。CStringクラスでは、プログラムが実行される時に動的にメモリ領域を確保してくれます。なので、char*型の引数を代入するように定義された関数にCString型の文字列を代入するときは、メモリ領域をどれだけ確保したらよいのかプログラム実行時まで分かりません。
このような場合どうするかというと、CStringクラスのGetBuffer()メンバ関数を用います。GetBuffer()は、引数に確保するメモリ領域のサイズを渡し、戻り値として確保されたメモリの先頭アドレスを渡します。
なのでchar*型の引数には、func( tmpStr.GetBuffer(10) )のように渡してやればよいです。