• ベストアンサー

hInstanceについて(Windowsプログラミング SDK)

いつもお世話になっております。^^) WindowsのSDKで基本を少し勉強しています。 ウインドクラスの定義のところで、アプリケーションのhInstanceを登録しているのですが、CreateWindowでも第10引数で、アプリケーションのhInstanceをいれなくてはいけません。 ウインドウクラスを定義した時点で、hInstanceはわかっているのに、どうして、CreateWindowの引数で必要になってくるのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • mitoneko
  • ベストアンサー率58% (469/798)
回答No.2

 当時の資料を失ってしまったので、うろ覚えですが・・・  windows 95の頃(確か、98も同じだったかな)は、メモリー空間が、今のwin2k以降のシステムのように完全に分離されていませんでした。また、メモリーもそんなに豊富に使える環境ではありませんでしたから、同じアプリケーションが作成した同じクラスのwindowのクラス定義データは、すべての実行インスタンスで共有していました。ウィンドウクラス定義において同じくラスの登録が2回目以降に実行された時には、前回のものを流用する形にして、同じハンドルを返していた記憶があります。もちろん、この形でクラス定義を登録しても、CreateWindowでは、実行インスタンスごとに、Windowを作成する必要がありますし、インスタンスも識別する必要があります。(でないと、同じプログラムのインスタンスが2つある時に、メッセージの処理が混乱しますから。)そこで、CreateWindowにも、hInstanceが必要になることになります。  win95の時代には、実に多彩なデータを、同時に実行された同じアプリケーション同士では共有していました。それらのデータを利用する際に、違うインスタンスを識別するために、このhInstanceというハンドルが必要だったわけです。(昔、win95の時代には、このhInstanceの特性を利用して、アプリケーションの同時実行の制御(たとえば、同時実行の禁止とか、2回目以降では違う挙動をするとか・・・)が簡単にできました。)  ところが、win2k以降のOSでは、同じアプリケーションを2つ同時に実行しても、お互いのメモリー空間は完全に遮断されるようになりました。いくら同じアプリケーションだからといって、メモリーを共有するなどと言うことはいっさいしていませんから、hInstanceそのものに意味が無くなりました。ですから、まぁ、なぜ必要なのという質問そのものに意味が無くなってます。  ちなみに、windows APIのインターフェースを変えることはアプリケーションの互換性を唱ってしまった限りはできませんでしたので、この引数も依然として残っています。  記憶で書いているので、自信のほどはなしとしておきます。大筋あっているはずですけど・・・

その他の回答 (2)

noname#30727
noname#30727
回答No.3

CreateWindow の lpClassName には、既存クラスの BUTTON や EDIT などが使用できます。 そのことから、理屈の上では、両者の hInstance が同じであるとは限りません。 DLL のメカニズム上、そうするしかなかったんでしょうね。

回答No.1

# 回答になってませんが。 MSDNを見ると、CreateWindow の第十引数は、 「NT/2000 では無視されます」だそうです。 過去の設計を引きずってるんですかねぇ……

参考URL:
http://www.microsoft.com/japan/msdn/library/ja/jpwinui/html/_win32_createwindow.asp

関連するQ&A