Люди, может, подскажете тупому программеру — что такое HANDLE?
Уже и встречался и даже работал... Но что это такое, так и не знаю... Странно, да? Вот и я так думаю. Объясните мне, пожалуйста.
Здравствуйте, _silent, Вы писали:
_>Люди, может, подскажете тупому программеру — что такое HANDLE? _>Уже и встречался и даже работал... Но что это такое, так и не знаю... Странно, да? Вот и я так думаю. Объясните мне, пожалуйста.
Здравствуйте, _silent, Вы писали:
_>Люди, может, подскажете тупому программеру — что такое HANDLE? _>Уже и встречался и даже работал... Но что это такое, так и не знаю... Странно, да? Вот и я так думаю. Объясните мне, пожалуйста.
Handle
1) рукоять, рукоятка, черенок, ручка
the handle of wife — рукоятка жены (скалка)
starting handle — кнопка "Старт" в Windows
2) удобный случай, возможность; повод, предлог
to give a handle to ... — дать рукояткой по (голове)
to take a girl by the best handle — использовать девушку наилучшим образом
4) управлять чем-л., справляться с чем-л. руками
she handled the boyfriend very easily — она с легкостью справлялась с товарищем
handle a wife — управлять женой (фантаст.)
5) хорошо управляться; слушаться (рук, руля и т. п.)
the wife handles well — жена идет/работает очень послушно (фантаст.)
6) обходиться, обращаться; управляться, справляться с кем-л., чем-л.
a wife handles all my affairs — жена занимается всеми моими делами (фантаст.)
handle with care! — осторожно! (надпись на свадебных платьях)
Здравствуйте, _silent, Вы писали:
_>Люди, может, подскажете тупому программеру — что такое HANDLE? _>Уже и встречался и даже работал... Но что это такое, так и не знаю... Странно, да? Вот и я так думаю. Объясните мне, пожалуйста.
Handle — идентификатор-указатель объекта. Термин используется в основном в процедурном программировании. Т.е. об объекте неизвестно ничего, а работа с ним осуществляется через методы, в которые этот handle и передаётся. Например, WinAPI. Или в CLX от Borland — используется библиотека Qt, которая возвращает указатели на объекты просто как целые.
_>Люди, может, подскажете тупому программеру — что такое HANDLE? _>Уже и встречался и даже работал... Но что это такое, так и не знаю... Странно, да? Вот и я так думаю. Объясните мне, пожалуйста.
Воспринимай его как универсальную ссылку (pointer) на некую структуру. Что это за структура, создана ли отдельно или является частью другой, — ты не знаешь. Но об этом прекрасно осведомлена та функция WinAPI, которая тебе его предоставила или которой ты его передашь.
При такой аналогии становится понятно, почему хэндлы нужно получать и освобождать. А уж API само разберется — заводить под него память или дать просто адрес, освобождать память при CloseHandle или ну его...
По аналогии — можно воспринимать классы как хэндлы, структура которых тебе известна.
Встречается еще аналогия, что HANDLE — это пароль, который тебе дают в одном месте, чтобы ты его произнес в другом и тебя пустили. Но это не объясняет, почему пароль нужно освобождать (CloseHandle).
Hello, _silent!
You wrote on Wed, 03 Dec 2003 11:44:16 GMT:
s> Люди, может, подскажете тупому программеру — что такое HANDLE? s> Уже и встречался и даже работал... Но что это такое, так и не знаю... s> Странно, да? Вот и я так думаю. Объясните мне, пожалуйста.
И я свою лепту внесу
Handle — это дескриптор, уникальный код общедостоступного (так или иначе) объекта в OS Windows
Q: А почему бы не воспользоваться ссылкой на этот объект?
А: ОС работает в защищенном режиме и если для одного процесса хранится в некий объект по адресу, скажем $FFFF, а для другого процесса по этому адресу может быть все что угодно, но только не этот объект, да и вообще из другого процесса до этого адреса не достучишься, вот и придумали Handle. %).
На эпоху структурного программирования,
когда проектировалось большинство ОС,
вместо объектов и методов
использовались структуры и функции для работы с ними.
Напр.,
PStruct = ^TStruct;
TStruct = record
Field: Integer;
end;
function GetField(Struct: PStruct): Integer;
begin
Result := Struct^.Field;
end;
Такой подход характеризуется полным отсутствием инкапсуляции, т.е.
каждый может получить полный доступ к полям структуры безо
всяких функций и сделать её состояние внутренне противоречивым.
Простейший способ решения этой проблемы —
просто скрыть от пользователя декларацию структуры:
type
THandle = Pointer;
function GetField(Handle: Pointer): Integer;
begin
Result := PStruct(Handle)^.Field;
end;
Здесь хэндл — просто указатель.
Так, например, устроен HINSTANCE(HMODULE).
Другая возможная реализация Хэндла — через
индекс в некоторой скрытой от пользователя таблице
(которая вообще говоря может лежать в другом адресном пространстве).
Пример такой реализации:
type
THandle = Integer;
function CreatePseudoObj: THandle;
procedure CloseHandle(Handle: THandle): THandle;
function GetField(Handle: THandle): Integer;
procedure SetField(Handle: THandle; Field: Integer);
implementation
type
PPseudoObj = ^TPseudoObj;
TPseudoObj = record
Field: Integer;
end;
var
ObjTable: array[0..MaxPseudoObjCount-1] of PPseudoObj;
function CreatePseudoObj: THandle;
var i: Integer;
begin
Result := 0;
for i := 0 to MaxPseudoObjCount-1 do
if ObjTable[i] = nil then
begin
Result := i;
Break;
end;
New(ObjTable[Result]);
end;
procedure CloseHandle(Handle: THandle): THandle;
begin
Dispose(ObjTable[Handle]);
Table[Handle] := nil;
end;
function GetField(Handle: THandle): Integer;
begin
Result := ObjTable[Handle]^.Field;
end;
procedure SetField(Handle: THandle; Field: Integer);
begin
ObjTable[Handle]^.Field := Field;
end;
Структура хэндла может быть составной — включать в себя
различные флаги и т.п.
Собственно, для реализация хэндла важно лишь уметь каким-то
образом получать по нему доступ к самому объект.
Здравствуйте, Dmitry V.Abramov, Вы писали:
_>>Люди, может, подскажете тупому программеру — что такое HANDLE? _>>Уже и встречался и даже работал... Но что это такое, так и не знаю... Странно, да? Вот и я так думаю. Объясните мне, пожалуйста.
DVA>Воспринимай его как универсальную ссылку (pointer) на некую структуру. Что это за структура, создана ли отдельно или является частью другой, — ты не знаешь. Но об этом прекрасно осведомлена та функция WinAPI, которая тебе его предоставила или которой ты его передашь.
Ты бы людей не путал словами pointer и ссылка — с непривычки еще поймут неправильно. Я бы сказал так: хендл, хотя официально это не регламентировано , — это идентификатор некоторой сущности. Одной сущности может соответствовать несколько идентификаторов.
DVA>При такой аналогии становится понятно, почему хэндлы нужно получать и освобождать.
Надо ли освобождать — зависит от сущности, чей идентификатор нас интересует. Если мы всего лишь пользуемся сущностью, созданной кем-то другим, то часто ничего освобождать не надо. Если же сущность находится в нашем владении (т.е. грубо говоря, мы ее создали, например, путем вызова ф-ии ОС, которая вернула хендл). Бывает, что владельцем сущности является ОС — тогда освобождать таки надо, но для того, чтобы ОС уменьшила счетчик ссылок на сущность и при достижении 0 удалила эту больше ненужную сущность (разумеется, некоторые сущности могут в из соображений оптимизации никогда не удаляться, если они используются часто — даже если счетчик достиг 0, можно предположить, что сущность "популярна" и ее скоро снова кто-то захочет поюзать).
Slicer
Специалист — это варвар, невежество которого не всесторонне :)
Здравствуйте, Diouzshev, Вы писали:
D>А: ОС работает в защищенном режиме и если для одного процесса хранится в некий объект по адресу, скажем $FFFF, а для другого процесса по этому адресу может быть все что угодно, но только не этот объект, да и вообще из другого процесса до этого адреса не достучишься, вот и придумали Handle. %).
А что бы окончательно внести ясность. Handle одного процесса в другом не действителен за исключением случаев когда мы специально ою этом позаботились.
В w2k Handle это смешение относительно начала таблицы Handle-ов процесса, в указанном месте начинается описание объекта ядра. Т.к. объект ядра может лежать и в памяти процесса и в памяти ядра давать на него указатель не разумно
Лоботомию в массы! (с)
Re[3]: Handle и все тут...
От:
Аноним
Дата:
04.12.03 07:16
Оценка:
Здравствуйте, Slicer [Mirkwood], Вы писали:
SM>Ты бы людей не путал словами pointer и ссылка — с непривычки еще поймут неправильно. Я бы сказал так: хендл, хотя официально это не регламентировано , — это идентификатор некоторой сущности. Одной сущности может соответствовать несколько идентификаторов.