[cbuilder:40091] BCB5のプログラムをCB2009に移植

386 views
Skip to first unread message

Y.Nishiguchi

unread,
Jul 11, 2009, 12:14:25 AM7/11/09
to C++ビルダーML投稿
西口です。

 ようやっと、手には入れていたCB2009を使い始めました。

 前に作成したプログラム(CB5で作成)をCB2009でBuildしたところ、

[BCC32 エラー] Misc1.cpp(21): E2034 'char *' 型は 'const wchar_t *' 型に変換できない

 と指摘されて、以前から使っていたメッセージ関係やら、RS232C通信関
係のテキスト処理が、すべて引っかかってしまいます。

 これって、他の方はどのように、対処されていますか?


~~~~~~~~~~~~~~~~~~~~~~
                 西口幸男
 E-mail: y_nish...@xa.ejnet.ne.jp
~~~~~~~~~~~~~~~~~~~~~~

Y.Nishiguchi

unread,
Jul 11, 2009, 6:08:51 AM7/11/09
to cbui...@sfdata.ne.jp

Y.Nishiguchi

unread,
Jul 11, 2009, 3:44:43 PM7/11/09
to cbui...@sfdata.ne.jp

TAKAHASHI, Tomohiro

unread,
Jul 11, 2009, 7:28:18 PM7/11/09
to cbui...@sfdata.ne.jp
高橋(智)です。
「'char *' 型は 'const wchar_t *' 型に変換できない」は、具体的には
どのようなコードで発生しているのでしょうか?

--
高橋智宏

Takeshi Kodama

unread,
Jul 11, 2009, 7:43:02 PM7/11/09
to cbui...@sfdata.ne.jp
CB2009から、VCLの扱う文字列はAnsiStringからUnicodeStringに変更されたのは
ご存じかと思います。AnsiStringとUnicodeStringは相互に暗黙変換可能なコンス
トラクタを持つので、ほとんどの局面で旧バージョンのコードを修正せずともコ
ンパイルできるはずです。

ただし、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>。

もちろん例外となる場合は多く、それは個別対応です。文字列を一般的なバイト
データ列として扱う場合は、間違いなく例外です。シリアル通信は最要注意でし
ょう。

Y.Nishiguchi

unread,
Jul 11, 2009, 9:41:26 PM7/11/09
to cbui...@sfdata.ne.jp

Y.Nishiguchi

unread,
Jul 12, 2009, 10:03:58 AM7/12/09
to cbui...@sfdata.ne.jp
西口です。 同じ投稿が3回も重なってしまいました。すみません。


> 高橋(智)です。
> 「'char *' 型は 'const wchar_t *' 型に変換できない」は、具体的には
> どのようなコードで発生しているのでしょうか?

 児玉さんに説明していただいております。
 TAplication のMessageBox巻数の引数です。

 児玉さんの説明で了解いたしました。

 ありがとうございました。

Y.Nishiguchi

unread,
Jul 12, 2009, 10:12:56 AM7/12/09
to cbui...@sfdata.ne.jp
西口です。

 児玉さん、いつも丁寧な回答ありがとうございます。

 TAplicationクラスのMessageBoxで、質問のエラーが発生していました。
 また、DBCreatで、"com1"とかの文字列でも同様なエラーが発生してい
ました。

 丁寧な説明のおかげで、最小限の変更をすれば良いことがわかりました。
 ありがとうございました。


~~~~~~~~~~~~~~~~~~~~~~
                 西口幸男
 E-mail: y_nish...@xa.ejnet.ne.jp
~~~~~~~~~~~~~~~~~~~~~~


Reply all
Reply to author
Forward
0 new messages