При использовании PInvoke я заметил, что нам нужно использовать IntPtr
для обращения к дескрипторам Windows. Мне интересно, почему не просто использовать int
для дескриптора? Мое понимание дескриптора заключается в том, что это просто целочисленное значение.
Зачем использовать IntPtr для обработки?
Ответ 1
Дескриптор окон определяется как целое число собственного размера указателя машины. Это так, что они могут тайно быть указателем, если они должны быть. (Возможно, дескриптор не является указателем, но ему разрешено быть одним, если разработчики операционной системы считают это необходимым. Обычно они не являются указателями по соображениям безопасности, поэтому людям слишком легко злоупотреблять системой, если они на самом деле указатели.)
Значение int в С#, определенное как 32-битное целое число, которое будет слишком маленьким на 64-битной машине. IntPtr определяется как целое число, которое может содержать указатель размера машины. Вот почему вы всегда используете IntPtr при взаимодействии с дескрипторами.
Ответ 2
Ручки представляют собой значения размера указателя.
Они имеют ширину 8 байтов на 64-разрядных платформах.
Ответ 3
Размер дескриптора зависит от архитектуры машины (32/64 бит). IntPtr
позаботится об этом.
Ответ 4
Дескриптор - это, по сути, указатель уровня системы, и указатель не неявно отбрасывается в int. Это само по себе. Итак, почему у вас есть IntPtr
в .NET для представления типа Handle.