web-dev-qa-db-ja.com

「ハンドル」とは何ですか?

重複の可能性:
Windowsハンドルとは何ですか?
「ハンドル」とは正確には何ですか?

ウィンドウハンドルへの参照、ウィンドウハンドルへの参照を持つコントロールなどが表示されます。しかし、何がわかりません。ハンドルはです。

特に、.NETに関連するものと、関連する詳細について知りたいと思います。

21
richard

ハンドルは、オペレーティングシステムのリファレンスです。プログラミング参照のセマンティクスはありませんが、API呼び出しで渡されたときに、システムリソースが参照している内容を認識できるようにします。

通常、HANDLEはクラスのインスタンスにラップされます。 CWndは良い例であり、ウィンドウへのハンドルであるHWNDが含まれています。

あなたはこれを行うことができます。 CWnd * pWnd = CWnd :: FromHandle(hWnd)注:CWnd :: FromHandle(hWnd)は静的であり、インスタンスを必要としないことに注意してください。

HWndがラップされているラッパーが返されます。よくありません!ハンドルが実際にオブジェクトでラップされていない場合は、ハンドルが作成され、一時的なものになります。一度使用してから破棄してください。 hWndの構造体には、WindowsがCWndオブジェクトをインスタンス化するのに十分な情報があるため、インスタンスを作成できます。ハンドルvオブジェクトテーブルには追加されないため、一時的なものにすぎません。

HWNDは実際にはカーネルオブジェクトであり、他にもありますか?

  • HWND(CWndおよびCWndから派生したクラス)
  • HDC(CDCおよびCDCから派生したクラス)
  • HMENU(CMenu)
  • HPEN(CGdiObject)
  • HBRUSH(CGdiObject)
  • HFONT(CGdiObject)
  • HBITMAP(CGdiObject)
  • HPALETTE(CGdiObject)
  • HRGN(CGdiObject)
  • HIMAGELIST(CImageList)
  • SOCKET(CSocket)(HSOCKETである必要がありますか?)
  • その他。

これらすべてが必要に応じて一時オブジェクトを返すかどうかはわかりません。 GetDC(hWnd)は、hWndからhDCを取得しますが、一時的なものであり、おそらくCDCクラスを使用する方が適切です。

続きを読む: http://wiki.answers.com/Q/What_is_a_handle_in_Windows_Programming#ixzz1JBmoF0lv

12
karthik

ハンドルは、別の関係者(通常はOS)から提供されたリソースへの抽象的な参照であり、そのリソースを参照するために戻すことができます。

OSには、多くの場合、ユーザーが作成したエンティティ(ファイルを開くなど)を含むハンドルテーブルが含まれています。ハンドルは、このテーブルへの整数インデックスです。プロセスが開き、OSがハンドルテーブルにエントリを作成し、(プロセス)名でマークを付け、そのエントリのインデックスをプロセスに返します。プロセスが読み取りを実行する場合、OSにハンドル整数を提供します。OSは、テーブルインデックスとして使用するだけで、ハンドル整数をテーブルで検索します。これで、プロセスがどのエンティティ(ファイル)から読み取りたいかがわかります。

プロセスIDをハンドルエントリに入力することにより、OSはハンドルがプロセスに対して有効かどうかを判断できます。プロセスは、OSへのハンドルとしてゴミ箱を提供できます。ハンドルスロットが一致すれば、OSはそれがどれほど愚かであっても、あなたが望むことをします。結局のところ、そのあなたのリソース。

5
Ira Baxter

ハンドルは、ソケット、同期プリミティブなど、OSオブジェクトを一意に識別するものです(Unixでは通常記述子と呼ばれます)。技術的には、グローバルオブジェクトテーブルのオフセットか、オブジェクト情報を含むレコードへのポインタのいずれかです。ただし、このハンドルは不透明な数値として扱う必要があります。

.NETはオブジェクトへの参照を使用するため、.NETでは、OSとの相互運用に関してハンドルに出くわします。