- 締切済み
自作ライブラリとプロジェクトの文字セットによる文字化けについて
お世話になります。 今回自作ライブラリ内にある、ウインドウ作成補助関数をUnicode、マルチバイト文字両対応にするべく作業を進めていたのですが、ある所でどうしても上手く行かず、どうしたものかと困っております。 概要は下記の通りです。 1. Unicode用関数とマルチバイト用関数は分けれらており、UNICODEマクロの有無によって使用する関数を自動的にわけています。 2. 自作ライブラリをUnicode文字セットでビルドし、ライブラリを使用するプロジェクトをマルチバイト文字セットでビルドした場合、ライブラリ内ウインドウ作成クラスから関数を利用してウインドウを作成すると、どうしてもタイトルバーのタイトルに文字化けが起こってしまう。 以下に要点だけをまとめたソースを記載させていただきます。 文字数の関係で、リンクとなってしまい申し訳ありません。 http://blog-imgs-26.fc2.com/b/a/l/balmysoft/CreateWindow.txt プロジェクトでの使用法は INT WINAPI WinMain( HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR szStr,INT iCmdShow) { CCreateWindow cw; cw.SimpleCreateWindow( _T("HelloWorld"), その他いろいろ... ); // その後の処理 // } このような形です。 ライブラリとの文字セットとの違いを考慮し、関数を分けて使い分けているのですが、実際にウインドウが作成されてみると、タイトルバーのタイトルが文字化けをしてしまっています。 また、関数内でもそれぞれの文字セット用の関数を呼び出しているつもりなのですが、これだけでは至らないのでしょうか? もちろんプロジェクト側の文字セットをUnicodeにすれば大丈夫です。 また、ライブラリ側をマルチバイト文字セット、プロジェクト側をUnicodeにすると、先頭の一文字だけがタイトルバーに表示されます。 今回の場合は H だけとなります。 これはワイド文字だからその通りの結果だと思うのですが、今回疑問に思っているのは。 WindowsAPI である CreateWindowA や CreateWindowW を使い分けても、実際はそのプロジェクトの文字設定によって影響されてしまうのか。 ということです。また、これを避ける手立てはあるのでしょうか? 長くなってしまい、大変申し訳ありません。 もしよろしければ、どなたか御教示頂けませんでしょうか。 宜しくお願い致します。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- Oh-Orange
- ベストアンサー率63% (854/1345)
★訂正。 CreateWindopw『s』が付いていなかったね。 とにかくヘッダを作りましょう。
- Oh-Orange
- ベストアンサー率63% (854/1345)
★追記。 『CreateWindow』この名前良くありませんね。 API名と衝突しています。 別の名前に変更して下さい。 // ライブラリを使用するソースのヘッダ部 #ifdef UNICODE #define SimpleCreateWindow SimpleCreateWindowW #else #define SimpleCreateWindow SimpleCreateWindowA #endif とか
補足
回答ありがとうございます。 申し訳ありません。シンプルにするために書き直した為、実際はアドバイスの通りSimpleCreateWindowとの形になっております。
- Oh-Orange
- ベストアンサー率63% (854/1345)
★アドバイス ・ライブラリの使い方が正しくない気がします。 >自作ライブラリをUnicode文字セットでビルドし… ↑ 自作ライブラリ(DLLも含む)を作成するときは、 Unicode文字セットでもマルチバイト文字セットでも 両方の関数(A、W)がコンパイルできないといけません。 つまり自作ライブラリには2つの関数が存在しないといけないのです。 2つとはCreateWindowW、CreateWindowAです。 ・それでライブラリを使用するプロジェクトは次のようにします。 // ライブラリを使用するソースのヘッダ部 #ifdef UNICODE #define CreateWindow SimpleCreateWindowW #else #define CreateWindow SimpleCreateWindowA #endif // ソース部 INT WINAPI WinMain( HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR szStr,INT iCmdShow) { CCreateWindow cw; cw.CreateWindow( _T("HelloWorld"), その他いろいろ... ); // その後の処理 // return 0; } ・ソース部では、UNICODE定数で呼ぶ関数を切り分けているのでCreateWindowという 関数名を使います。直接SimpleCreateWindowとやっても駄目です。
補足
ご回答頂き有難うございます。 大変申し訳ありません。要点だけシンプルにと思い、ソースをかきまちがえてしまいました。 実際はCCreateWindowヘッダを読み込み、そこで #ifdef UNICODE #define CreateWindow SimpleCreateWindowW #else #define CreateWindow SimpleCreateWindowA #endif としてマクロを割り振っておりまして、実際のプロジェクト側からの使用もそのマクロを使用するようにしております。 ちょうどお教え頂いた方法と同じような用法なのですが、 ブレークを当てて確認したところ、プロジェクト側の文字セットに対応した関数には飛んでおり、その中で対応する文字セット用の関数でウインドウを作成しているのですが、文字化けが起こってしまいます。 なにかライブラリを作成した時点で、WindowsAPIの方がUnicode用に作成されてしまっているのでしょうか? もしお時間あれば、宜しくお願い致します。 失礼致します。
補足
時間が無くあせっていた為、 誤字や脱字が多くなってしまいましたので、もう一度新たにソースをしっかり付けて質問させて頂きたいと思います。 ありがとうございました。