- ベストアンサー
自作ライブラリの文字セットを両対応にしたが、上手くいかない
前回質問させて頂いたのですが、こちらの不手際でソース内容の不十分や誤字や脱字が目立ちましたので、再度質問をさせて頂きます。申し訳ありません。 今回自作ライブラリ内に、ウインドウ作成補助用クラスを作成したいと思っております。 そこで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などと使いわけているのに上手くいかないのは疑問です。。。 どうにか、この問題を避ける手立てはあるのでしょうか? 長くなってしまい、大変申し訳ありません。 もしよろしければ、どなたか御教示頂けませんでしょうか。 何卒、宜しくお願い致します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
DefWindowProc() や GetMessage(), DispatchMessage() などにも A と W の両関数がありますので、 おそらくそれらも対応させるようにしないと文字コードの問題が残り続けると思います。 もっとも中身がブラックボックスなので、それで確実だという保証はありませんが……
その他の回答 (2)
- php504
- ベストアンサー率42% (926/2160)
と思ったら"Release"モードで文字コードセットを変えるのを忘れてただけでした 前の回答は無視してください
お礼
了解いたしました。 わざわざ確認して頂き、有難う御座います。
- php504
- ベストアンサー率42% (926/2160)
VisualC++2008 ExpressEditionで試してみました "Debug"モードでは不具合が確認できました "Release"モードでは正常に動いているようです 参考まで
お礼
ご回答有難う御座います。 やはり不具合が起こってしまいますか・・・。 もっと文字セットに特化したウインドウの作成方法があるのでしょうか。 自分自身でも色々と調べさせて頂きます。 有難う御座いました。
お礼
ご指摘頂きました通り、クラスが用意していたプロシージャ内でDefWindowProcを呼び出していた為、ライブラリの文字セットの関係でDefWindowProcWやDefWindowProcAに静的になってしまっていたようでした。 プロシージャを各文字セットごとに用意する事で解決をする事ができました。 本当に有難う御座いました。