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

VCでプログラミングをしています。基本的なことなのですが質問があります。教えてください。

1._T()を使ったコードでマルチバイドでコンパイルしてもエラーになりません。これは無視されるのでしょか?また、出来たコードは_T()で囲っていてもマルチバイトでしょうか(Unicodeではない)?

2.例えばMessageBox関数を利用するとWindows APIのMessageBoxAあるいはMessageBoxWが最終的に呼ばれると思います。どちらを呼ぶかはコンパイルあるいはリンクした際に決まるのでしょうか?

3.PCWSTRとLPCWSTRは同じWCHRで16BIT UNICODEなのでしょうか?

4.仮にプログラムから直接MessageBoxWを呼ぶとき、マルチバイトでコンパイルして引数がUNICODEでないマルチバイトを渡したとき、どうやってMessageBoxWはUNICODEとして扱うのでしょうか?コンパイルエラーならずに正しく実行できるようです。

以上、よろしくお願いします。


●質問者: mai_mai_mail
●カテゴリ:コンピュータ インターネット
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● JULY
●34ポイント

1._T()を使ったコードでマルチバイドでコンパイルしてもエラーになりません。これは無視されるのでしょか?また、出来たコードは_T()で囲っていてもマルチバイトでしょうか(Unicodeではない)?

tchar.h を見れば分かると思います。

_T() マクロは、__T()

#define _T(x) __T(x)

と定義されていて、__T() マクロが、_UNICODE が定義されているかどうかで違っていて、

#ifdef _UNICODE
 ?
#define __T(x) L ## x
 ?
#else /* ndef _UNICODE */
 ?
#define __T(x) x
 ?
#endif /* _UNICODE */

となっています。なので、_T("abc") は、UNICODE 時は「L"abc"」、マルチバイト時は「"abc"」に展開されます。

2.例えばMessageBox関数を利用するとWindows APIのMessageBoxAあるいはMessageBoxWが最終的に呼ばれると思います。どちらを呼ぶかはコンパイルあるいはリンクした際に決まるのでしょうか?

コンパイル時です。WinUser.h に、このように書かれています。

#ifdef UNICODE
#define MessageBox MessageBoxW
#else
#define MessageBox MessageBoxA
#endif // !UNICODE

3.PCWSTRとLPCWSTRは同じWCHRで16BIT UNICODEなのでしょうか?

同じと考えて良いです。WinNT.h で、このようになっています。

typedef __nullterminated CONST WCHAR *LPCWSTR, *PCWSTR;

PCWSTR も LPCWSTR も同じ定義になっています。

4.仮にプログラムから直接MessageBoxWを呼ぶとき、マルチバイトでコンパイルして引数がUNICODEでないマルチバイトを渡したとき、どうやってMessageBoxWはUNICODEとして扱うのでしょうか?コンパイルエラーならずに正しく実行できるようです。

ごめんなさい。これは実際に試したことが無いので、今、「へぇ?」って思っています(^^;。


2 ● SweetSmile1978
●33ポイント

1:
_T() は、UNICODE が define されているかどうか
(プロジェクトの設定がユニコードになっているかどうか)によって、
ユニコードかマルチバイトかが決まります。
ですので、_T() 自体はプロジェクトの設定がマルチバイトの時でも問題ありません。
ただ、wchar_t 型やそのポインタを受け取る関数の引数としていると
コンパイルエラーが出るはずです。

2:
UNICODE がdefineされているかどうか
(プロジェクト設定でUNICODEになっているかどうか)によって
コンパイル時に決定されます。

3:
LP?系とP?系はその後が同じ名前なら同じです。
LP は Long Pointer を表し、16bit Windows 時代の遺物です。
未だに LP?系が圧倒的に多く使われるのでややこしいですね。

4:
そのコードを見てみないとなんとも言えませんね。
MessageBoxW(NULL, L"テストメッセージ", L"テスト", MB_OK);
なんてコードだとプロジェクトの設定がマルチバイトでも
コンパイルは通りますね。


3 ● SweetSmile1978
●33ポイント

DLL内のUNICODEを引数に必要とする関数を
通常マルチバイトを扱う実行ファイルから呼び出す場合、
Windows APIである MultiByteToWideChar関数を使用して
自分でそのマルチバイト文字列をUNICODE文字列に変換する必要があります。

関連質問

●質問をもっと探す●



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