No.1ベストアンサー
- 回答日時:
OSを限定しないと正確な説明はできないので、ここではWindowsを仮定します。
(他のOSの場合は補足願います。)グラフィックオブジェクト(エディットやボタンなど)の「ハンドル」と、カーネルオブジェクト(プロセスやスレッド)の「ハンドル」にはいくつか大きな違いがあります。
【グラフィックオブジェクトのハンドルの性質】
・1つのオブジェクトに1つのハンドル番号が割り当てられる
・ハンドル番号の割り当てがシステム全体で重複しない
・どのプロセスからも同じハンドル番号で同じオブジェクトを参照できる
【カーネルオブジェクトのハンドルの性質】
・1つのオブジェクトに複数のハンドル番号を割り当てることができる
・同じハンドル番号でも別のプロセスでは別のオブジェクトを指しているかもしれない
・同じハンドル番号でも別のプロセスでは無効かもしれない
例えば、プロセスAでウィンドウを作成し、そのハンドルが0x15e8だったとします。このとき別のプロセスBでハンドル0x15e8のウィンドウを操作すると、同じウィンドウを操作することになります。
これに対して、プロセスAでスレッドを作成し、そのハンドルが0x2ab0だったとします。このとき別のプロセスBでハンドル2ab0のスレッドを操作しようとしても、それが可能だとは限りません。
プロセスBがプロセスAのハンドルを「継承」しているか、プロセスBがスレッドの「識別子(ID)」を取得し、そこからプロセスB内で有効なハンドルを取得すれば、プロセスAのスレッドを操作することができるようになります。前者の場合、プロセスAの中で使用していたスレッドのハンドルがそのまま使えますが、後者の場合は同じ「プロセスAのスレッド」に対して、異なる値を持つ「プロセスB内で有効なハンドル」を取得することになります。
カーネルオブジェクトのハンドルはプロセスごとに割り当てられるので、システム全体を通じてハンドルを一覧することは通常はできません。しかしプロセスとスレッドに限っては、システム全体を通じての一覧ができないと不便です。そのため、プロセスとスレッドには特別に、システム全体を通じて一意であることが保証されている「識別子」が用意されています。
この「識別子」はグラフィックオブジェクトのハンドルと似た性質があります。
【プロセス識別子・スレッド識別子の性質】
・1つのオブジェクト(プロセスまたはスレッド)に1つの識別子が割り当てられる
・識別子の割り当てがシステム全体で重複しない
・どのプロセスからも同じ識別子で同じオブジェクトを識別できる
なお、識別子はオブジェクトを「識別」する(例えばスレッドAとスレッドBが同じか違うかを判断する)ためには使用できますが、オブジェクトの状態を「参照」・「操作(変更)」する(例えばスレッドAを停止する)ためには使用できません。識別子は「どのオブジェクトであるか」という情報を提供するだけだからです。
それ以上の情報の取得やオブジェクトの状態の操作は、プロセスごとにその参照・操作が許されているかどうかの設定(セキュリティ設定)があり、その設定を確認するためにオブジェクトを「開いて」ハンドルを取得する必要があります。
オブジェクトを開いてハンドルを取得する際には「オブジェクトに対してどういう操作を行うか」を指定します。このときシステムは、指定された操作が許されているかどうかをチェックします。ハンドルが取得できれば、その操作を行う権限があるということになります。
ハンドルと識別子の違いはこんなところです。
内容が難しくてあんまり分かりませんでしたが知りたかったことはかなり分かりました。
ウインドウオブジェクトの変更はハンドルを使うけど、別プロセスのウインドウオブジェクトに触れる時は、ハンドルよりもグローバルな識別子を使って目的のウインドウオブジェクトか確認してからハンドルを使ってウインドに触れるんですよね。
CreateProcessの継承は、プロセスのハンドルのスコープの幅に関するもので、オブジェクトの性質を継承するようなJAVA感覚の継承とは違う内容のようですね。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Illustrator(イラストレーター) ワードに貼った画像のキャンバスと画像本体のサイズの調整 2 2022/05/19 18:31
- その他(学校・勉強) この中で間違ってある説明はありますか?詳しい方に教えていただきたいです。 A. 1つのプログラムが複 2 2023/07/14 01:15
- カスタマイズ(バイク) SR400のハンドルを初めて交換しようと思うのですが、7/8インチのハンドルを購入したらそのままつけ 2 2023/02/03 22:09
- その他(IT・Webサービス) スマホアプリのトラッキング、アプリの広告識別子、IDFA、IDFVについて教えてください 0 2023/05/06 08:40
- その他(IT・Webサービス) スマホアプリのトラッキング、アプリの広告識別子、IDFA、IDFVについて教えてください 0 2023/05/06 10:14
- その他(自転車) つかぬ事を伺いますが……、自転車って道路の左側通行で良いんですよね? 6 2022/10/10 14:13
- その他(自転車) よく高校生くらいの男の子が自転車のハンドルを握らずにスマホを操作しながら走ったり(スマホをいじってい 4 2022/10/07 14:02
- バイク免許・教習所 まだ教習通う前ですが、バイクに乗る上での注意点をまとめてみました。間違ってる箇所や、他の項目・アドバ 5 2022/04/27 19:44
- その他(車) 【右バック駐車】かなり大回りになってしまった場合のベストの方法 6 2022/11/04 07:11
- 建設業・製造業 普通旋盤のアソビ 1 2023/05/17 11:30
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プロセスIDの取得方法について
-
プロセスのアタッチ・デタッチ...
-
バックグラウンドのプロセスの...
-
ウィンドウのタイトルからプロ...
-
タスクマネージャーのプロセス...
-
sleep関数の精度について
-
C#でのbatファイル実行結果取得
-
完全な乱数を生成する方法
-
explorer.exeが異様にメモリを食う
-
怪しいプロセス教えてください。
-
C++のプログラムをバックグラウ...
-
OSPFでプロセスを分ける意義に...
-
ShellExecuteExでハンドルの取得
-
起動中の他のプログラム(orプ...
-
ADOでアクセスのレコードに...
-
Trend Micro Anti-Malware Solu...
-
ShellExecuteが起動したプロセ...
-
C++でシェルを起動
-
Windowsでのfork方法
-
別のプロセスの関数を呼び出す...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
explorer.exeが異様にメモリを食う
-
タスクマネージャーのプロセス...
-
C#でのbatファイル実行結果取得
-
プロセスのアタッチ・デタッチ...
-
VB6.0 SHELLで起動...
-
プロセスIDからウィンドウハ...
-
Process.Startの戻り値を後で取得
-
ウィンドウのタイトルからプロ...
-
他のEXEが起動しているかの確認
-
ADOでアクセスのレコードに...
-
怪しいプロセス教えてください。
-
別のプロセスの関数を呼び出す...
-
C++のプログラムをバックグラウ...
-
Linuxでのスレッド間メッセージ...
-
C++でシェルを起動
-
プロセスIDの取得方法について
-
OSPFでプロセスを分ける意義に...
-
非表示になったエクセルは?
-
Windowsでのfork方法
おすすめ情報