5

Что такое HANDLE? Я начал путать его с контекстом устройства. Но что-то мне подсказывает, что это разные вещи.

Kyubey
  • 32,103
perfect
  • 10,021

3 Answers3

18

HANDLE - дескриптор, т.е. число, с помощью которого можно идентифицировать ресурс. С помощью дескприторов можно ссылаться на окна, объекты ядра, графические объекты и т.п.

Можно провести аналогию с массивом: у нас имеется набор ресурсов, а HANDLE - это индекс, который указывает на конкретный ресурс. Это все, конечно, абстрактно, но думаю идея понятна.

skubarenko
  • 2,680
  • 2
    Я бы еще добавил, что HANDLE - это такой отдаленный аналог указателя на некий ресурс. – Barmaley Nov 17 '14 at 08:32
  • 2
    Угу. Opaque pointer. То есть ссылка на объект (число, по которому ядро может идентифицировать объект), но не обязательно адрес. Может быть индексом во внутренней таблице, нативным указателем, в котором некоторые биты используются «не по назначению» или с несколькими специальными значениями, чем угодно. – VladD Nov 17 '14 at 21:27
6

Вы не работаете с контекстом устройства напрямую. Сам по себе контекст устройства - "черный ящик", что у него внутри, мы не знаем. У контекста устройства есть хэндл (идентификатор), который, например, возвращают функции CreateDC и GetDC и который можно передать в другие WinAPI функции.

Получается, контекст устройства (DC) - некий сложный объект, а хэндл контекста устройства (hDC) - число. Хэндл контекста устройства - это один из видов (частный случай) хэндлов. Кроме хэндлов DC, есть хэндлы окон, файлов, битмэпов, всяких кистей/карандашей и т.д.

insolor
  • 49,104
3

Любой контекст может быть обозначен хендлом, но не всякий хендл ссылается на контекст устройства.

Хендл - это просто указатель. Контекст - это уже часть памяти, где хранятся различные настройки, параметры и данные связанного "устройства".

Nicolas Chabanovsky
  • 51,426
  • 87
  • 267
  • 507
KoVadim
  • 112,121
  • 6
  • 94
  • 160