• 締切済み

自作ライブラリとプロジェクトの文字セットによる文字化けについて

お世話になります。 今回自作ライブラリ内にある、ウインドウ作成補助関数を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 を使い分けても、実際はそのプロジェクトの文字設定によって影響されてしまうのか。 ということです。また、これを避ける手立てはあるのでしょうか? 長くなってしまい、大変申し訳ありません。 もしよろしければ、どなたか御教示頂けませんでしょうか。 宜しくお願い致します。

みんなの回答

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.3

★訂正。  CreateWindopw『s』が付いていなかったね。  とにかくヘッダを作りましょう。

ayumi_g
質問者

補足

時間が無くあせっていた為、 誤字や脱字が多くなってしまいましたので、もう一度新たにソースをしっかり付けて質問させて頂きたいと思います。 ありがとうございました。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

★追記。  『CreateWindow』この名前良くありませんね。  API名と衝突しています。  別の名前に変更して下さい。 // ライブラリを使用するソースのヘッダ部 #ifdef UNICODE #define SimpleCreateWindow SimpleCreateWindowW #else #define SimpleCreateWindow SimpleCreateWindowA #endif とか

ayumi_g
質問者

補足

回答ありがとうございます。 申し訳ありません。シンプルにするために書き直した為、実際はアドバイスの通りSimpleCreateWindowとの形になっております。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.1

★アドバイス ・ライブラリの使い方が正しくない気がします。 >自作ライブラリを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とやっても駄目です。

ayumi_g
質問者

補足

ご回答頂き有難うございます。 大変申し訳ありません。要点だけシンプルにと思い、ソースをかきまちがえてしまいました。 実際はCCreateWindowヘッダを読み込み、そこで #ifdef UNICODE #define CreateWindow SimpleCreateWindowW #else #define CreateWindow SimpleCreateWindowA #endif としてマクロを割り振っておりまして、実際のプロジェクト側からの使用もそのマクロを使用するようにしております。 ちょうどお教え頂いた方法と同じような用法なのですが、 ブレークを当てて確認したところ、プロジェクト側の文字セットに対応した関数には飛んでおり、その中で対応する文字セット用の関数でウインドウを作成しているのですが、文字化けが起こってしまいます。 なにかライブラリを作成した時点で、WindowsAPIの方がUnicode用に作成されてしまっているのでしょうか? もしお時間あれば、宜しくお願い致します。 失礼致します。

関連するQ&A

  • 自作ライブラリの文字セットを両対応にしたが、上手くいかない

    前回質問させて頂いたのですが、こちらの不手際でソース内容の不十分や誤字や脱字が目立ちましたので、再度質問をさせて頂きます。申し訳ありません。 今回自作ライブラリ内に、ウインドウ作成補助用クラスを作成したいと思っております。 そこでUnicode、マルチバイト文字両対応にするべく作業を進めていたのですが、ある所でどうしても上手く行かず、どうしたものかと困っております。 自作ライブラリは静的リンクですので、dllの形ではありません。 概要は以下の通りです。 1. Unicode用関数とマルチバイト用関数は分けれらており、UNICODEマクロの有無によって使用する関数を自動的にわけています。 2. 自作ライブラリと、それを使用するプロジェクト側の文字セットが違うと、それぞれ上手くいかない。 ライブラリがUnicodeセット、使用するプロジェクトがマルチバイトだと文字化け。 ライブラリがマルチバイト、使用するプロジェクトがUnicodeセットだとchar型と認識されて2文字目にNULLが入り、1文字しか表示されない。 3. ブレークを当てると、使用するプロジェクト側の文字セットに合った関数にはちゃんと飛んでいます。 以下文字数の関係から、ソースURLを記載させて頂きます。 全文ですので多少冗長になってしまいますが、宜しくお願い致します。 ヘッダー http://blog-imgs-26.fc2.com/b/a/l/balmysoft/CreateWindowh.txt 実装部 http://blog-imgs-26.fc2.com/b/a/l/balmysoft/CreateWindowcpp.txt プロジェクトでの使用法は INT WINAPI WinMain( HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR szStr,INT iCmdShow) { HWND hWnd; BalmyWindows::CCreateWindow cw; cw.SimpleCreateWindow( &hWnd, hInst, 0, 0, 640, 480, false, _T("Hello"), NULL, NULL ); } このような形です。 これだけでは思い描いた形には至らないのでしょうか? もちろんプロジェクト側とライブラリ側との文字セットを同一にすれば上手くいきます ライブラリとそれを使用するプロジェクトの文字セットが違ってしまうと、上手くいかないようです。 ライブラリを作成した時点でWindowsAPI側がUNICODEマクロの影響を受け、静的に固定されてしまうものなのでしょうか? あまりコアな部分は詳しくなく、分からないのですが、APIであるCreateWindowを明示的にCreateWindowWやCreateWindowAなどと使いわけているのに上手くいかないのは疑問です。。。 どうにか、この問題を避ける手立てはあるのでしょうか? 長くなってしまい、大変申し訳ありません。 もしよろしければ、どなたか御教示頂けませんでしょうか。 何卒、宜しくお願い致します。

  • VC++ マルチバイト文字とUniCode文字??

    VC++のプロジェクトプロパティには文字セット指定があります 『マルチバイト文字セット』『UniCode文字セット』の2者が選択出来ますが、これらの選択の優劣は何処にありますか? この選択の適否が分からない私は参考にしているサンプルがマルチバイトである時にはマルチバイトを、またUniCodeで書かれたサンプルを見ている際にはUniCodeを指定しており、恥ずかしいかぎりです 選択の判断基準を如何すれば良いのかご指導をお願い申し上げます 更に恥ずかしい質問】なぜC#には文字セット指定が見当たらないのでしようか???

  • 定義した文字列を wchar_t 系の関数へ

    こんにちは。 VisualStudioでマルチバイト文字セットを使用する設定のプロジェクトで、下記のように定義された文字列を wchar_t をパラメータとする関数にセットするにはどのようにすればよろしいのでしょうか? #define _FOO "foo" void funcA( const char* const szValue ) { } void funcW( const wchar_t* const szValue ) { } void test( void ) { funcA( TEXT( FOO )) ; ← ok。 funcW( TEXT( FOO )) ; ← エラー。 } UNICODE文字セットを使用する設定のプロジェクトならば問題ないのですが、マルチバイト設定ですとエラーになってしまいます。UNICODE、マルチバイト両方にプロジェクトに対応できるにはどうきじゅつすればよろしいのでしょうか。

  • MFC:リッチエディットからUnicode文字列を受け取りたい

    MFCのダイアログベースでプロジェクトを作成 ↓ プロジェクトのプロパティで「マルチバイト文字セットを使用する」を「Unicode文字セットを使用する」に変更 ↓ エディットボックスとリッチエディット2.0を適当に配置 ↓ エディットボックスとリッチエディット2.0それぞれにコントロール変数を追加 ↓ InitInstance()内に AfxInitRichEdit2(); を追加 ↓ あとは適当なところでエディットボックスとリッチエディット2.0それぞれにGetWindowText関数を使って、記入内容を取得します。     すると、エディットボックスではUnicodeの文字を入れても文字化けしないのに対し、リッチエディット2.0では文字化けしてしまいます。 例えば“Å”の半角文字を(Unicode紹介サイトからコピペする等して)入力すると、エディットボックスではそのまま“Å”なのに、リッチエディット2.0では“A”になります。   ※入力している段階では“Å”と表示されています。GetWindowText関数で取得すると“A”になってしまいます。     リッチエディット2.0からUnicode文字を正常に受け取れる方法はありませんでしょうか。

  • VC++2010の文字セット

    VisualStudio2010の文字セットに関して質問があります。 VisualStudio2010でC++でコンソールアプリのプロジェクトを作ります。 このプロジェクトの文字セットは、プロジェクトのプロパティから見ると デフォルトでUNICODEになっています。 そこでUTF-8のテキストファイルを作成した後に以下のプログラム をデバッガで実行したのですが、szLineの全角文字列が化けて読めません。 (szLineにはUNICODEが入っているのだからウォッチで正常に参照できると思いました) fp = fopen("file.txt", "r"); fgets(szLine, sizeof(szLine), fp); fclose(fp); 試しにSJISのテキストファイルだとデバッガで文字化けしません。 開発環境と文字セットの関係はどうなっているのでしょうか? バッファの中身を正しく表示するための設定があるのでしょうか? それとも、根本的に私の考えが間違っているのでえようか? 詳しい方がいたら教えて下さい。宜しくお願い致します。

  • VBA  コンパイルエラー:プロジェクトまたはライブラリがみつかりませ

    VBA  コンパイルエラー:プロジェクトまたはライブラリがみつかりません。 Excel2000で作成したマクロ(VBA)をExcel2007(OS:VISTA)上互換モードでコンパイルして動かしていました。このマクロをExcel2007(64ビットWindows7)でコンパイルしようとすると「コンパイルエラー:プロジェクトまたはライブラリがみつかりません。」でコンパイルできません。対象は「chr()、mid()、trim()」等の関数のようです。 解決策をご教授いただきたくお願いいたします。

  • VS2013での文字セットの切り替え

    VS2012までは、MBCSとUnicodeの文字セットの切り替えを、IDEのメニューの 「プロジェクト」→「~のプロパティ」→「構成プロパティ」→「全般」→「文字セット」 で選択できていたのですが、VS2013では同じようにようにやってみても見つかりません。 どなたか、VS2013での文字セットの切り替え方法を御存知の方、操作方法を教えていただけないでしょうか? よろしくお願いします。

  • visual studio2010 文字コード

    visual studio2010を使っています。Cのプログラムを書いてます。 文字セットを選ぶ箇所で ・マルチバイト文字セットを使用する ・Unicode文字セットを使用する という2つの選択肢がありますが、 上を選ぶとshift-jisの文字コードが選ばれると認識してます。 それで、下のUnicode文字セットを使用するを選んだ場合なんですが、 これはutf-16のことですか? utf-8が主流だと思っていたのでここでさすUnicodeが勝手に utf-8のことだと思ってたんですが、 visual studioで扱っている方はワイド文字で、 utf-8について調べたらASCIIにも対応できる可変長のマルチバイト という風に書いてあったので、あれ?と思い色々調べたら ウィンドウズではメモ帳などでUnicodeという表記でutf-16を指すみたいなので これも同じでutf-16なのかなと思いました。 ただ、visual studioで扱うUnicodeはワイド文字ということと、 utf-16は2バイト固定ではなく2バイト単位なだけで 4バイトで1文字を表すこともあることが書いてあったので、 これはワイド文字とは違う??と混乱してます。 それともワイド文字は2バイト固定と思ってたんですが wchar_tが2バイトずつなだけでワイド文字は1文字2バイトというわけではない ということでしょうか? それとwchar_tで2個分で1文字を表したりする使い方はするんでしょうか? まとまりのない質問になってしまいましたがよろしくおねがいします。

  • マルチバイトと英語版Windows7

    VS2005 で MFC を使いながらエディターを作ったりしています。 プロジェクトファイルの設定で、 マルチバイト文字セットを使用する とした場合、日本語のWin7では、うまく表示できますが、 この作成されたソフトを、英語版のWin7の上で動かした場合、 文字はきちんと表示されるのでしょうか? Unicode文字セットを使用する にして、作り直さないと、英語版のWin7ではうまく動かないのでしょうか? よろしく、お願いします。

  • VisualC++2005を使うと文字化けします。

    よろしくお願いします。windowsXP sp2です。 初めて、visualC++2005を使って『ウィンドウを作る』サンプルプログラムを実行したのですが、 作成されたウィンドウの、『タイトルバーの部分』 に表示される文字が化けてしまいます。 同じプログラムを『BCCDeveloper』で作成すると、文字化けしないで表示されます。 visualC++2005の設定で、どこか間違っているのでしょうか? 詳しい方、アドバイスをお願いします。

専門家に質問してみよう