私は最近、C ++でのWindowsプログラミングに関する本を何冊か読んでいますが、WinAPIで繰り返される概念のいくつかについて混乱を招く理解がありました。たとえば、handleキーワード「H」で始まるデータ型はたくさんありますが、これらはポインタのように使用されることになっていますか?ただし、ポインタキーワード「P」で始まる他のデータ型があります。だから私はそうは思わない。それでは、それは正確には何ですか?そして、そもそも、いくつかのデータ型へのポインターが別々のデータ型を与えられたのはなぜですか?たとえば、PCHARはCHAR*になるように簡単に設計できますか?
2 に答える
ハンドルは、以前のバージョンのWindowsではポインターでしたが、現在はそうではありません。それらを「Cookie」と考えてください。これは、Windowsが以前に割り当てられたリソースを見つけることを可能にする一意の値です。CreateFile()が新しいハンドルを返すように、後でSetFilePointer()とReadFile()でそれを使用して、同じファイルからデータを読み取ります。また、CloseHandle()を使用して内部データ構造をクリーンアップし、ファイルも閉じます。これは一般的なパターンであり、リソースを作成するための1つのAPI関数、リソースを使用するための1つ以上、およびリソースを破棄するための1つです。
はい、Pで始まる型はポインタ型です。そして、はい、それらは不要です。*自分で使用する場合も同様に機能します。Cプログラマーがそれらを宣言するのが好きな理由は実際にはわかりませんが、個人的にはコードの可読性が低下すると思い、常に避けています。ただし、LPCWSTRのような「定数幅の文字列への長いポインタ」のような複合型に注意してください。Lは、16ビットバージョンのWindowsにまでさかのぼるという意味ではありません。ただし、pointer、const、wideは重要です。私はそのtypedefを使用しますが、そうしないと将来の移植性の問題が発生するリスクがあります。これが、これらのtypedefが存在する主な理由です。
ハンドルは、両方が特定のアイテムをIDする限り、ポインターと同じです。明らかに、ポインタはアイテムのアドレスであるため、その構造がわかっている場合は、アイテムのフィールドの取得を開始できます。ハンドルはポインタである場合とそうでない場合があります。基本的に、ハンドルがポインタである場合は、それが何を指しているのかわからないため、フィールドに入ることができません。
ハンドルを考える最良の方法は、それがシステム内の何かの一意のIDであるということです。それをシステム内の何かに渡すと、システムはそれを何にキャストするか(それがポインターの場合)またはそれをどのように扱うか(それが単なるIDまたはインデックスの場合)を認識します。