ようやっと、手には入れていたCB2009を使い始めました。
前に作成したプログラム(CB5で作成)をCB2009でBuildしたところ、
[BCC32 エラー] Misc1.cpp(21): E2034 'char *' 型は 'const wchar_t *' 型に変換できない
と指摘されて、以前から使っていたメッセージ関係やら、RS232C通信関
係のテキスト処理が、すべて引っかかってしまいます。
これって、他の方はどのように、対処されていますか?
~~~~~~~~~~~~~~~~~~~~~~
西口幸男
E-mail: y_nish...@xa.ejnet.ne.jp
~~~~~~~~~~~~~~~~~~~~~~
--
高橋智宏
ただし、VCLにはAnsiString/UnicodeStringではなく、文字列ポインタをそのまま
引数とする自由関数/メンバ関数が含まれます。TApplicatonクラスのMessageBox
メンバ関数が代表例です。この場合の殆どにおいて、旧バージョンでchar*だった
引数はwchar_t*に変更されています。
WinAPIの問題にも気を付ける必要があります。WinAPIにおいて文字列を扱う関数
の殆どはAnsi版とUnicode版の二種類が用意されていて、例えばCreateFileという
自由関数は、Ansi版のCreateFileAとUnicode版のCreateFileWの二種類が存在し、
UNICODEマクロによって切り替えます。
CB2009でUNICODEマクロが設定されるのは、[プロジェクト|オプション|ディレク
トリと条件定義|_TCHARのマップ先]がwchar_tの場合です。このデフォルトはchar
なので、何もしないとUNICODEマクロは設定されていません。
従って_TCHARのマップ先がcharのままの場合、VCLの文字列ポインタを引数とする
関数(の殆ど)はwchar_t*が引数なのに、WinAPIの文字列ポインタを引数とする関数
はchar*が引数です。
以下は雑な対処法で、シンプルなアプリケーションならこれでCB2007(Ansi)/
CB2009(Unicode)互換のソースになると思います。元ネタはオリジナルMLのどこか
で見たものです。
(1)_TCHARマップ先をwchar_tにする。
(2)AnsiStringをStringに変更する。
(3)charはTCHARに変更する。LPSTRはLPTSTRに、LPCSTRはLPCTSTRに変更する。
(4)文字列リテラルは、TEXTマクロで囲む。例えば、"Hellow World"はTEXT(
"Hellow World")。
(5)rtlは標準版とユニコード版を自動切り替えするマクロに変更する。例えば、
strcmpは_tcscmp。
(6)stlは基底文字型を明示するように書きかえる。例えば、stringは
basic_string<TCHAR>。
もちろん例外となる場合は多く、それは個別対応です。文字列を一般的なバイト
データ列として扱う場合は、間違いなく例外です。シリアル通信は最要注意でし
ょう。
> 高橋(智)です。
> 「'char *' 型は 'const wchar_t *' 型に変換できない」は、具体的には
> どのようなコードで発生しているのでしょうか?
児玉さんに説明していただいております。
TAplication のMessageBox巻数の引数です。
児玉さんの説明で了解いたしました。
ありがとうございました。
児玉さん、いつも丁寧な回答ありがとうございます。
TAplicationクラスのMessageBoxで、質問のエラーが発生していました。
また、DBCreatで、"com1"とかの文字列でも同様なエラーが発生してい
ました。
丁寧な説明のおかげで、最小限の変更をすれば良いことがわかりました。
ありがとうございました。
~~~~~~~~~~~~~~~~~~~~~~
西口幸男
E-mail: y_nish...@xa.ejnet.ne.jp
~~~~~~~~~~~~~~~~~~~~~~