インスタンスハンドル
読み:インスタンスハンドル
外語: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への移植を想定したソフトウェアの場合は、最初からこのように記述しておいた方がよい。

再検索