インスタンスハンドル

読み:インスタンスハンドル
外語:Instance Handle 英語
品詞:名詞

インスタンスを表わすためのハンドル。Windowsのプログラミングなどで使われる。

目次

Windowsでは、インスタンスハンドルはHINSTANCE型で表わされる。

インスタンスごとに異なる値を持っているが、プログラマーは、インスタンスハンドルの内容が何であるかを意識する必要はない。インスタンスごとに異なる値を持っている、ということが分かれば、それで良いからである。

ポインターの長さと同じになっており、Win16では16ビット、Win32では32ビット、Win64では64ビットとなっている。

ポインター

Win16での正体は定かではないが、Win32/Win64では、インスタンスハンドルはポインターである。より具体的には、モジュールのベースアドレスを指すポインターそのものである。

ポインターと言っても、それはOS内部の情報であるため、プログラマーが参照することは許されていない。このため古いWindowsのコンパイラーでは、これがvoid *で定義されていた。現在のコンパイラーでは工夫が凝らされていて、未使用の数値を内容に持つ構造体へのポインターであり、異なるハンドル同士の代入で警告が出せるようになっている。

Win16

Windows 3.1までの16ビット環境(Win16)では、全てのプロセスが同じメモリー空間(コードセグメント)で動作した。

このため、各プロセスは互いに重なり合わないように別のアドレスにロードされ、そしてプロセスごとにインスタンスハンドルは異なっている。

Win32

概念

Windows NTおよびWindows 95以降の32ビット環境(Win32)では、各プロセスごとに独自のメモリー空間を使用する。従って、プロセスごとにリロケート(再配置)する必要がないため、通常は実行可能ファイルに記載されたベースアドレス通りにメモリーに読み込まれる。

Win32では、インスタンスハンドルはプロセス内でのモジュールを識別するためのものである。異なるプロセス間でのやり取りに使われる物ではないため、同じプロセス内で一意であれば問題ない。従って、OS全体として見れば、インスタンスハンドルの値は重複している可能性がある。

Win32で、同じ実行ファイルの別インスタンスを識別するには、プロセスハンドルを使う。但しプロセスハンドルまで必要になるのは稀であり、一般的にはウィンドウハンドルでも充分と考えられる。

取得方法

LoadIconやLoadMenuといったインスタンスハンドルを要求するAPIを使用する場合、インスタンスハンドルを得る必要がある。

C/C++のプログラムが起動された時点で、_tWinMain関数などでHINSTANCE型の引数が得られているので、これをグローバル変数として保存してもよいが、グローバル変数を使いたくない場合はAPIでも取得できる。

HINSTANCE hInst = (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE);

HICON hIcon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_hogehoge));

ただし、GetWindowLong関数でHINSTANCEを得るのは古い手法であり、移植性が失われている。

64ビット対応とするためには、後述するGetWindowLongPtr関数を使用しなければならない。

Win64

64ビットのWindows(Win64)も32ビットと大差ないが、長さが64ビットとなったため、取得するためのAPIとパラメーターが変わっているため注意が必要である。

HINSTANCE hInst = (HINSTANCE)GetWindowLongPtr(hDlg, GWLP_HINSTANCE);

この方法は、Win32でもWin64でも使用できるため、Win64への移植を想定したソフトウェアの場合は、最初からこのように記述しておいた方がよい。

コメントなどを投稿するフォームは、日本語対応時のみ表示されます


KisoDic通信用語の基礎知識検索システム WDIC Explorer Version 7.04a (27-May-2022)
Search System : Copyright © Mirai corporation
Dictionary : Copyright © WDIC Creators club