2012-01-27 2 views
4

引数を持たないにもかかわらず、GetWindowLong(およびGetWindowLongPtr)には 'ANSI'(A)と 'Unicode'(W)のフレーバーがあることがわかりました。 MSDN page on GetWindowLongは、これらの亜種が存在することを示していますが、理由は言及していません。GetWindowLongにANSIとUnicodeのバリエーションがあるのはなぜですか?

CreateWindowEx(A/Wの味もあります)またはRegisterClassのエンコーディングと一致する必要がありますが、これは意味があるとは思えません。どうやら、それは重要です。なぜなら、someone reported that the Unicode version may fail on XP(XPはNTですが、私が理解しているように、すべてのUnicodeがフードの下にあります)。私はまた、(両方のフレーバーがGetWindowLongを含む)の32ビットバージョンを逆アセンブルしようとしました。また、明らかなエンコードの違いに基づいて余分な作業が行われています*。

どの機能を選択する必要がありますか?


* GetWindowLongの味は、彼らが他の関数に渡す周りのブール値を除いて、同一です。このブール値は、メモリ構造のフラグビットと比較されます。スタティックコード分析を使用して追跡することはできません。

+1

愚かな質問 - なぜ2012年にANSIバージョンが気になるのですか? –

+0

私はそれが重要である2つのシナリオを想像することができます。 1つは、サードパーティが提供するウィンドウクラスを使用する場所で、ANSIクラスとして登録します。舞台裏で起こる「A <-> W」変換は、パフォーマンス上の不利益を被る可能性があります。もう1つはANSIを使用する場所です(たとえば、ゲームを作成していて、ウィンドウが全画面表示されているなど)。 –

+0

私は..まあ、関数は内部的に(ANSIアプリケーションのために)変換を行います。また、UIコードの文字列変換のパフォーマンスはあまり問題になりません。 –

答えて

7

私は、現在のウィンドウプロシージャがGetWindowLongPtrの呼び出し元と互換性がない場合、あなたはそれを呼び出すことができないので、その後、実際の関数ポインタを返すことができないWhat are these strange values returned from GWLP_WNDPROC?

、理由はレイモンド陳氏の記事で説明されていると考えています。代わりに、 "魔法のクッキー"が返されます。このCookieの唯一の目的は、CallWindowProcによって認識されるため、メッセージパラメータをウィンドウプロシージャが期待する形式に変換することができます。

たとえば、Windows XPを実行していて、ウィンドウがUNICODEウィンドウであるが、ANSIとしてコンパイルされたコンポーネントがGetWindowLong(hwnd、GWL_WNDPROC)を呼び出すとします。呼び出し元がANSIウィンドウメッセージを使用しているが、ウィンドウプロシージャがUNICODEウィンドウメッセージを必要とするため、RAWウィンドウプロシージャは返されません。代わりに、魔法のクッキーが返されます。この魔法のクッキーをCallWindowProcに渡すと、「ああ、メッセージをANSIからUNICODEに変換し、そのウィンドウプロシージャにUNICODEメッセージを渡す必要があります」と認識します。

+0

それでは、ウィンドウがUNICODEウィンドウであることはどうですか? 'RegisterClassW'または' CreateWindowExW'ですか? –

+2

['RegisterClassEx'](http://msdn.microsoft.com/en-us/library/windows/desktop/ms633587.aspx)は、次のことを決定します:" RegisterClassExAを使用してウィンドウクラスを登録すると、アプリケーションはシステム作成されたクラスのウィンドウは、ANSI文字セットを使用するテキストまたは文字パラメータを持つメッセージを期待する、RegisterClassExWを使用して登録する場合、システムがメッセージのテキストパラメータをUnicodeとして渡すようにアプリケーションが要求します。 –

関連する問題