wind32 apiでExtTextOutはExtTextOutWとExtTextOutAがあります。どちらを使うかはプログラムを書いている人は意思意識しません。どのような条件でいつどちらを利用するかがきまるのでしょうか?

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2009/10/08 20:29:44
  • 終了:2009/10/14 00:18:31

回答(2件)

id:makeworld No.1

makeworld回答回数75ベストアンサー獲得回数232009/10/08 20:47:27

ポイント30pt

Unicodeに対応するための仕組みです。Wがワイド文字用、Aがマルチバイト文字用です。

WやAの付かない関数を呼び出すと、プリプロセッサ識別子のUNICODEが定義されているか否かで、ワイド文字用又はマルチバイト用の関数が呼び出されます。

Windows API - Wikipedia

id:cx20 No.2

cx20回答回数607ベストアンサー獲得回数1082009/10/12 16:44:34

ポイント40pt

どのような条件でいつどちらを利用するかがきまるのでしょうか

makeworld さんが、既に回答されていますが、プリプロセッサで「/D UNICODE」の定義がされていると UNICODE 用の API が呼び出されます。

#ifdef UNICODE
  #define TextOut  TextOutW
#else
  #define TextOut  TextOutA
#endif

また、C のランタイムの場合は「汎用テキスト関数」を使用した場合、「/D _UNICODE」の定義により、UNICODE 用の関数が呼び出されます。

#ifdef  _UNICODE
  #define _tprintf  wprintf
#else
  #define _tprintf  printf
#endif
■ 汎用テキスト マップ(汎用テキスト関数) / ルーチンのマップ
http://msdn.microsoft.com/ja-jp/library/tsbaswba%28VS.80%29.aspx

VS2005 (VC++8.0) 以降では、プロジェクトのデフォルトの設定が「Unicode 文字セットを使用する」になっています。

具体的には、

[プロジェクト] - [プロパティ] - [構成プロパティ] - [全般] - [文字セット] 

の設定が

「Unicode 文字セットを使用する」

になっています(この設定は「/D UNICODE」「/D _UNICODE」をプリプロセッサに定義するのと同じ意味になります。)

上記の設定がされている場合は ExtTextOut() → ExtTextOutW() の置換が行われます。


もし、意図して UNICODE を使用されているのでなければ、この設定は、

「マルチ バイト文字セットを使用する」

に変更してみてください(VS2005 より前のコンパイラ(VC++6.0、VC++7.1 等)では、プロジェクトのデフォルトは、この設定になっていました。)

この設定により ExtTextOut() → ExtTextOutA() の置換が行われます。


何故、このような、変更が行われたのか?は、推測ですが、Windows 9x系が主流ではなくなった為ではないかと思います。

Windows NT 系の OS(Windows 2000, XP, Vista 等)は、内部は Unicode で動作している為、表示等を行うときに「マルチ バイト文字」→「UNICODE」の変換が行われています。

この為、最初から、UNICODE ビルドにしておけば、無用な変換が行われなくなる(最適化される)ため、そうしたのではないか?と思います。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません