お世話になります。
今回自作ライブラリ内にある、ウインドウ作成補助関数をUnicode、マルチバイト文字両対応にするべく作業を進めていたのですが、ある所でどうしても上手く行かず、どうしたものかと困っております。
概要は下記の通りです。
1.
Unicode用関数とマルチバイト用関数は分けれらており、UNICODEマクロの有無によって使用する関数を自動的にわけています。
2.
自作ライブラリをUnicode文字セットでビルドし、ライブラリを使用するプロジェクトをマルチバイト文字セットでビルドした場合、ライブラリ内ウインドウ作成クラスから関数を利用してウインドウを作成すると、どうしてもタイトルバーのタイトルに文字化けが起こってしまう。
以下に要点だけをまとめたソースを記載させていただきます。
文字数の関係で、リンクとなってしまい申し訳ありません。
http://blog-imgs-26.fc2.com/b/a/l/balmysoft/Crea …
プロジェクトでの使用法は
INT WINAPI WinMain( HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR szStr,INT iCmdShow)
{
CCreateWindow cw;
cw.SimpleCreateWindow(
_T("HelloWorld"),
その他いろいろ... );
// その後の処理 //
}
このような形です。
ライブラリとの文字セットとの違いを考慮し、関数を分けて使い分けているのですが、実際にウインドウが作成されてみると、タイトルバーのタイトルが文字化けをしてしまっています。
また、関数内でもそれぞれの文字セット用の関数を呼び出しているつもりなのですが、これだけでは至らないのでしょうか?
もちろんプロジェクト側の文字セットをUnicodeにすれば大丈夫です。
また、ライブラリ側をマルチバイト文字セット、プロジェクト側をUnicodeにすると、先頭の一文字だけがタイトルバーに表示されます。
今回の場合は H だけとなります。
これはワイド文字だからその通りの結果だと思うのですが、今回疑問に思っているのは。
WindowsAPI である CreateWindowA や CreateWindowW を使い分けても、実際はそのプロジェクトの文字設定によって影響されてしまうのか。
ということです。また、これを避ける手立てはあるのでしょうか?
長くなってしまい、大変申し訳ありません。
もしよろしければ、どなたか御教示頂けませんでしょうか。
宜しくお願い致します。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
★追記。
『CreateWindow』この名前良くありませんね。
API名と衝突しています。
別の名前に変更して下さい。
// ライブラリを使用するソースのヘッダ部
#ifdef UNICODE
#define SimpleCreateWindow SimpleCreateWindowW
#else
#define SimpleCreateWindow SimpleCreateWindowA
#endif
とか
この回答への補足
回答ありがとうございます。
申し訳ありません。シンプルにするために書き直した為、実際はアドバイスの通りSimpleCreateWindowとの形になっております。
No.1
- 回答日時:
★アドバイス
・ライブラリの使い方が正しくない気がします。
>自作ライブラリをUnicode文字セットでビルドし…
↑
自作ライブラリ(DLLも含む)を作成するときは、
Unicode文字セットでもマルチバイト文字セットでも
両方の関数(A、W)がコンパイルできないといけません。
つまり自作ライブラリには2つの関数が存在しないといけないのです。
2つとはCreateWindowW、CreateWindowAです。
・それでライブラリを使用するプロジェクトは次のようにします。
// ライブラリを使用するソースのヘッダ部
#ifdef UNICODE
#define CreateWindowSimpleCreateWindowW
#else
#define CreateWindowSimpleCreateWindowA
#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用に作成されてしまっているのでしょうか?
もしお時間あれば、宜しくお願い致します。
失礼致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# VisualStudioのソースコードで漢字を使いたい 4 2022/05/21 10:16
- Excel(エクセル) エクセル関数の変わった使い方 3 2022/05/13 17:12
- HTML・CSS HTMLの・要素・属性・属性値 はプログラム言語の「変数」みたいに変更できますか? 5 2022/10/04 05:27
- Excel(エクセル) エクセルで”入力シート”の文字書式の変更を”出力シート”で同じ文字書式で印刷したいです。VBA希望 4 2023/04/24 11:07
- 政治 私の発明した「二階建て漢字」は使えるでしょうか? 3 2023/02/08 16:40
- Visual Basic(VBA) 特定の文字を簡単な操作で半角スペースに変換するか削除したい 2 2022/11/01 10:35
- PostgreSQL 数値が定期的にあらわれる文字列から、いくつめに出現した数値が指定して切り出したい 1 2023/06/08 13:12
- Excel(エクセル) Excelの空文字判定について 7 2023/01/06 13:25
- CAD・DTP 「機能ブロック図」の描画用フリーソフトを教えてください 1 2022/09/23 16:12
- JavaScript カラーミーショップのsectionループ内で、[引数][戻り値]ありの関数的な処理を行いたいです。 1 2022/05/07 19:39
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Windows Media Playerを開くと...
-
32768以上の乱数を作りたいので...
-
Google ColaboでGUI作成
-
iCloudフォトライブラリ内の画...
-
Ps+のフリープレイでDestiny2の...
-
静的ライブラリから静的ライブ...
-
DLL読み込み時エラー
-
declaration of 'index' shadow...
-
モバイルCというC言語のプログ...
-
ATLとSTLの違いは何でしょうか?
-
お絵かきソフトプログラミング...
-
rewindはfstream...
-
フーリエ変換やFFTのプログラム
-
本格的なGUIを作るのにおすすめ...
-
DXライブラリで作成したゲーム
-
MFC/C++ sprintf の代わりに <<
-
iPhoneのカメラロールへ画像を...
-
自作ライブラリとは?
-
ListViewで複数項目のドラッグ...
-
jQueryのポップアップでデザイ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Google ColaboでGUI作成
-
Ps+のフリープレイでDestiny2の...
-
Windows Media Playerを開くと...
-
本格的なGUIを作るのにおすすめ...
-
iCloudフォトライブラリ内の画...
-
python urlopen error について...
-
scipy っていうのをいれようと...
-
LIBCMT.LIBをリンクしてコンパ...
-
ライブラリ作成時のグローバル...
-
【iTunes】CDをiPhoneに取り込...
-
静的ライブラリから静的ライブ...
-
boostのアンインストールについて
-
cでなぜguiアプリが作成出来る...
-
標準ライブラリだけでgetch関数...
-
Dreamweaverのライブラリが反映...
-
stricmp
-
iPhoneのカメラロールへ画像を...
-
ベッセル関数を使う
-
【C#C++】Win32API呼び出し
-
C++ 標準ライブラリの実際の中...
おすすめ情報