ポインタ

いわゆるC言語などのポインタを扱う場合は、通常は System.IntPtr を利用する。
ただし、C言語などで型としてポインタであるが、実際の値は任意の32ビット値(または64ビット値)が格納されている場合は、System.UIntPtr を利用しなければならない。
これは、System.IntPtr がプラットフォームアドレスとして有効な範囲*1である 0x00000000〜0x7FFFFFFF しか*2受け入れない仕様となっているためだ。
いわゆる HANDLE は、Win32 SDK のヘッダファイルにおいてアドレスとして定義されているので IntPtr で良い。*3

*1:3G mode はとりあえず考慮しない

*2:正確には -0x80000000〜0x7FFFFFFF...つまり int.MinValue 〜 int.MaxValue

*3:しかし、独自のハンドル Hxxx を SDK のヘッダファイルの定義を用いず適当に define していて 0x80000000 以上の値をとれたりするライブラリも存在する