人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

●質問者: mai_mai_mail
●カテゴリ:コンピュータ インターネット
✍キーワード:API プログラム 意識
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● makeworld
●30ポイント

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

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

Windows API - Wikipedia


2 ● cx20
●40ポイント

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

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 ビルドにしておけば、無用な変換が行われなくなる(最適化される)ため、そうしたのではないか?と思います。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ