質問

う"取扱い"のような資源Windows?受取方法:とっても簡単!

役に立ちましたか?

解決

この抽象基準値にリソースが多く、メモリまたはファイルを開く、またはパイプです。

適切に, は、Windows、一般的にコンピューティングのハンドルを抽象化イリアルメモリアドレスからのAPIのユーザーのシステム再編成の物理メモリに透明のプログラム。解決のハンドルへのポインターロックメモリの扱いを無効にポインタです。この場合、さらに新しい指標として、テーブルのポインタ...ご利用の指標システムのAPI呼び出し、システム変更のポインタを表します。

また、リアルポインタを与えることができるとして扱う際はAPIライターの意のユーザにAPIする絶縁から内容のアドレスを返ポイント;この場合することを考慮しなければなどを取り扱ポイントが変更する可能性からのAPIのバージョンをバージョンからでも呼び出しのたびのAPIを返しますハンドル)に対応することが重要であると思われたとして扱われだけで不透明な値に有意義な のみ のAPIとなります。

いる現代経営システムであっても、いわゆる"リアルポインタなりますので、ご注意ください不透明な取扱の仮想記憶空間のメモリープロセスの組み合わせることにより、O/Sの管理、並べ替えのメモリなし無効のポインター内のものです。

他のヒント

A HANDLE はコンテキスト固有の独自の識別子です。によるコンテキスト固有の、私が意味するのは、ハンドルで得られた文脈になるようにするその他のaribtraryすることも HANDLEs.

例えば、 GetModuleHandle を返しますユニークな識別子を現在ロードされます。返される操作で子供から高齢者まで扱いや使用するその他の機能を受け入れるモジュール。できます。機能を必要とする他の種類の。例えば、せんでしたが、少し足を延ばせば、対応から返される GetModuleHandleHeapDestroy とを期待することができるようになりますか?

HANDLE そのものは一体タイプです。通常は必須ではないが、ポインタを一元タイプまたはメモリの場所です。例えば、 HANDLE 返される GetModuleHandle 実際にポインタをベース仮想メモリのアドレスモジュールです。がルールを記載を取り扱う必要のポインタ.ハンドルにもなるだけ単純な整数をできるのではないかと思によると、Win32APIを指標配列に格).

HANDLEs意図的に不透明な表現を提供する封止および抽象化から内部またはWin32ます。このように、Win32Apiを変える可能性がある、基本となる型の裏手に最適な影響を及ぼユーザコードの他の方でものがある。

これら三つの異なる内部実装のWin32APIを使った、と Widgetstruct.

Widget * GetWidget (std::string name)
{
    Widget *w;

    w = findWidget(name);

    return w;
}
void * GetWidget (std::string name)
{
    Widget *w;

    w = findWidget(name);

    return reinterpret_cast<void *>(w);
}
typedef void * HANDLE;

HANDLE GetWidget (std::string name)
{
    Widget *w;

    w = findWidget(name);

    return reinterpret_cast<HANDLE>(w);
}

最初の例を紹介内部の詳細は、API:することが可能であるユーザコードを知る GetWidget ポインタを返します struct Widget.この結果:

  • ユーザコードにアクセスのヘッダファイルを定義する Widget struct
  • ユーザコードの可能性のある変更の内部部品の返却 Widget struct

両方のこれらの結果が望ましくない。

次の例は隠すこと内部のディテールからのユーザコードを返却だけで void *.のユーザコードは必要ありませんアクセスのヘッダを定義する Widget struct.

三つ目の事例は全く同じというの void * a HANDLE です。のではないでしょうか郊外のユーザコードからそうとしていることそのもの void * ポイントです。

なぜってこのお悩みではないですか?このことを考え四の新しいバージョンの同じAPI:

typedef void * HANDLE;

HANDLE GetWidget (std::string name)
{
    NewImprovedWidget *w;

    w = findImprovedWidget(name);

    return reinterpret_cast<HANDLE>(w);
}

この機能のインタフェースは同一の例です。このユーザコードを継続して使用することが可能ですこの新しいバージョンのAPIの変更等を行っても、"舞台裏"の実装は、変更の NewImprovedWidget 構造体です。

にこれらの例はんだ、と考えることが好,名 void *, であることを HANDLE のWin32APIを見てみま でMSDN).この不透明な壁との間のユーザコードやWin32の図書館の内部表現を増加させる移植性とバージョンのWindowsのコードを使用するWin32APIに含まれています。

Win32プログラミングでHANDLEは、Windowsカーネルによって管理されているリソースを表すトークンです。ハンドルは、ウィンドウなど、ファイルにすることができます。

ハンドルは、単にあなたは、Win32 APIを使用して仕事をしたい微粒子リソースを識別する方法です。

あなたはウィンドウを作成し、画面上に表示したい場合は、次の操作を行うことができ、例えばのでます:

// Create the window
HWND hwnd = CreateWindow(...); 
if (!hwnd)
   return; // hwnd not created

// Show the window.
ShowWindow(hwnd, SW_SHOW);

上記の例では、HWND「ウィンドウへのハンドル」を意味します。

あなたは状態だなしのメソッドを持つクラスのインスタンスとしてHANDLEと考えることができ、オブジェクト指向言語に使用されている場合は、

他の関数によってのみ変更可能です。この場合、のShowWindow の関数は、ウィンドウハンドルの状態を変更します。

ハンドルとデータ型は、より多くの情報のためを参照してください。

ハンドルは、Windowsによって管理されるオブジェクトの一意の識別子です。それはいくつかのデータにアクセスするためにユーザーコードによって逆参照することができ、アドレスではありませんSENCEにポインタのようにのですが、のないポインタの。代わりにハンドルがハンドルが識別するオブジェクトに対してアクションを実行できる機能のセットに渡される。

ハンドルは、データベース内のレコードの主キー値のようなものである。

編集1:downvote、主キーが一意にデータベースレコードを特定し、Windowsシステムでのハンドルが一意に、開いているファイルなどを、ウィンドウを識別する理由も、それは私が言ってんだよ。

だから、最も基本的なレベルでの任意の並べ替えのHANDLEは、ポインタへのポインタですか。

#define HANDLE void **

今、あなたはそれを使用したいと思う理由として、

セットアップを取ることができます:

class Object{
   int Value;
}

class LargeObj{

   char * val;
   LargeObj()
   {
      val = malloc(2048 * 1000);
   }

}

void foo(Object bar){
    LargeObj lo = new LargeObj();
    bar.Value++;
}

void main()
{
   Object obj = new Object();
   obj.val = 1;
   foo(obj);
   printf("%d", obj.val);
}

OBJは値で渡されたため、(コピーを作成し、機能にそれを与える)fooへのので、printf関数は、1の元の値を表示します。

今、私たちはFOOを更新する場合:

void foo(Object * bar)
{
    LargeObj lo = new LargeObj();
    bar->val++;
}

のprintfは、2の更新された値を印刷する可能性があります。しかしfooはメモリ破壊や例外のいくつかのフォームを引き起こしてしまう可能性もあります。

その理由は、このあなたが今、あなたはまた、メモリの2つのメグスを割り当てている機能にOBJを渡すためにポインタを使用していている間に

、これはOSがobjの位置を更新する周りのメモリを移動する可能性があります。あなたは値によってポインタが渡されているので、objが移動してしまった場合は、その後OSは、ポインタが、関数内のコピーではなく、潜在的原因の問題を更新します。

のfooへの最終更新:

void foo(Object **bar){
    LargeObj lo = LargeObj();
    Object * b = &bar;
    b->val++;
}

このは常に更新された値を表示します。

コンパイラは、それが不動としてそれらをマークポインタにメモリを割り当てる場合、参照、それほど大きな物体によって引き起こされるメモリのいずれかの再シャッフリングは、最終的な場所を見つけるために正しいアドレスをポイントする関数に渡された値を割り当てられていますメモリに更新します。

ハンドル(hWndは、FILEなど)の任意の特定のタイプは、メモリの破損から保護するために構造の特定のタイプにドメイン固有の点である。

それを記述する構造体であるとして、Windowsのウィンドウを考えます。この構造体には、Windowsの内部の一部であり、あなたはそれの詳細を知る必要はありません。代わりに、Windowsはその構造体のための構造体へのポインタのtypedefを提供します。それは「ハンドル」これであなたは、ウィンドウ上のホールドを取得することができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top