- ベストアンサー
hInstanceについて(Windowsプログラミング SDK)
いつもお世話になっております。^^) WindowsのSDKで基本を少し勉強しています。 ウインドクラスの定義のところで、アプリケーションのhInstanceを登録しているのですが、CreateWindowでも第10引数で、アプリケーションのhInstanceをいれなくてはいけません。 ウインドウクラスを定義した時点で、hInstanceはわかっているのに、どうして、CreateWindowの引数で必要になってくるのでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
当時の資料を失ってしまったので、うろ覚えですが・・・ windows 95の頃(確か、98も同じだったかな)は、メモリー空間が、今のwin2k以降のシステムのように完全に分離されていませんでした。また、メモリーもそんなに豊富に使える環境ではありませんでしたから、同じアプリケーションが作成した同じクラスのwindowのクラス定義データは、すべての実行インスタンスで共有していました。ウィンドウクラス定義において同じくラスの登録が2回目以降に実行された時には、前回のものを流用する形にして、同じハンドルを返していた記憶があります。もちろん、この形でクラス定義を登録しても、CreateWindowでは、実行インスタンスごとに、Windowを作成する必要がありますし、インスタンスも識別する必要があります。(でないと、同じプログラムのインスタンスが2つある時に、メッセージの処理が混乱しますから。)そこで、CreateWindowにも、hInstanceが必要になることになります。 win95の時代には、実に多彩なデータを、同時に実行された同じアプリケーション同士では共有していました。それらのデータを利用する際に、違うインスタンスを識別するために、このhInstanceというハンドルが必要だったわけです。(昔、win95の時代には、このhInstanceの特性を利用して、アプリケーションの同時実行の制御(たとえば、同時実行の禁止とか、2回目以降では違う挙動をするとか・・・)が簡単にできました。) ところが、win2k以降のOSでは、同じアプリケーションを2つ同時に実行しても、お互いのメモリー空間は完全に遮断されるようになりました。いくら同じアプリケーションだからといって、メモリーを共有するなどと言うことはいっさいしていませんから、hInstanceそのものに意味が無くなりました。ですから、まぁ、なぜ必要なのという質問そのものに意味が無くなってます。 ちなみに、windows APIのインターフェースを変えることはアプリケーションの互換性を唱ってしまった限りはできませんでしたので、この引数も依然として残っています。 記憶で書いているので、自信のほどはなしとしておきます。大筋あっているはずですけど・・・
その他の回答 (2)
CreateWindow の lpClassName には、既存クラスの BUTTON や EDIT などが使用できます。 そのことから、理屈の上では、両者の hInstance が同じであるとは限りません。 DLL のメカニズム上、そうするしかなかったんでしょうね。
- fatal_error
- ベストアンサー率39% (23/58)
# 回答になってませんが。 MSDNを見ると、CreateWindow の第十引数は、 「NT/2000 では無視されます」だそうです。 過去の設計を引きずってるんですかねぇ……