2012-02-07 2 views
10

При использовании PInvoke я заметил, что для ссылки на дескрипторы Windows мы должны использовать IntPtr. Мне интересно, почему бы просто не использовать int для ручки? Мое понимание дескриптора заключается в том, что это просто целочисленное значение.Зачем использовать IntPtr для обработки?

+7

Вы делаете наиболее распространенную ошибку, которая вызывает несовместимость x64. – SLaks

+5

Несомненно, они являются целыми значениями. Но никто не сказал, что они должны быть 32 бит ... – Mehrdad

ответ

18

Ручка окна определяется как целое число нативного машинного указателя размером. Это так, что они могут тайно быть указателем, если они должны быть. (Ручка, вероятно, не указатель, но это разрешено быть одним, если разработчики операционной системы считают это необходимым. Обычно они не являются указателями по соображениям безопасности, что делает его слишком легким для людей, чтобы злоупотреблять системой если они на самом деле являются указателями.)

int in C#, определяемый как 32-битное целое число, которое будет слишком маленьким на 64-битной машине. IntPtr определяется как целое число, которое может содержать указатель размера машины. Вот почему вы всегда используете IntPtr при взаимодействии с ручками.

10

Ручки указатель размером значения.

Ширина 8 байтов на 64-битных платформах.

+1

Я бы сказал «pointer- * size *» вместо «pointer» (хотя, я думаю, в строгом смысле C/C++ это не слишком точно, поскольку дескрипторы 'typedef''d как указатель в порядке, а' size_t' не обязательно является размером указателя) ... но если они являются индексами в таблице, скорее всего, они используются как целые числа. Но да, точка взята. – Mehrdad

+1

Хорошая идея; похищенный – SLaks

2

Ручка - это, по сути, указатель уровня системы, и указатель не неявно бросается в int. Это само по себе. Вот почему у вас есть IntPtr в .NET для представления типа Handle.

4

Размер ручки зависит от архитектуры машины (32/64 бит). IntPtr позаботится об этом.