Handle и все тут...
От: _silent Россия http://www.bezhetsk.ru
Дата: 03.12.03 11:44
Оценка:
Люди, может, подскажете тупому программеру — что такое HANDLE?
Уже и встречался и даже работал... Но что это такое, так и не знаю... Странно, да? Вот и я так думаю. Объясните мне, пожалуйста.
С уважением, _silent << RSDN@Home >>
Re: Handle и все тут...
От: s.ts  
Дата: 03.12.03 11:47
Оценка: +1
Здравствуйте, _silent, Вы писали:

_>Люди, может, подскажете тупому программеру — что такое HANDLE?

_>Уже и встречался и даже работал... Но что это такое, так и не знаю... Странно, да? Вот и я так думаю. Объясните мне, пожалуйста.

идентификатор объекта
Re: Handle и все тут...
От: mrhru Россия  
Дата: 03.12.03 12:09
Оценка: :)))
Здравствуйте, _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 — использовать девушку наилучшим образом

3) оснащать (что-л.) ручкой, рукоятью; приделывать рукоять (к чему-л.)
to 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! — осторожно! (надпись на свадебных платьях)

Re: Handle и все тут...
От: mrhru Россия  
Дата: 03.12.03 12:26
Оценка: 6 (1)
Здравствуйте, _silent, Вы писали:

_>Люди, может, подскажете тупому программеру — что такое HANDLE?

_>Уже и встречался и даже работал... Но что это такое, так и не знаю... Странно, да? Вот и я так думаю. Объясните мне, пожалуйста.

Handle — идентификатор-указатель объекта. Термин используется в основном в процедурном программировании. Т.е. об объекте неизвестно ничего, а работа с ним осуществляется через методы, в которые этот handle и передаётся. Например, WinAPI. Или в CLX от Borland — используется библиотека Qt, которая возвращает указатели на объекты просто как целые.
Re: Handle и все тут...
От: Dmitry V.Abramov Россия http://imap.ru
Дата: 03.12.03 15:03
Оценка: 10 (2)
_>Люди, может, подскажете тупому программеру — что такое HANDLE?
_>Уже и встречался и даже работал... Но что это такое, так и не знаю... Странно, да? Вот и я так думаю. Объясните мне, пожалуйста.

Воспринимай его как универсальную ссылку (pointer) на некую структуру. Что это за структура, создана ли отдельно или является частью другой, — ты не знаешь. Но об этом прекрасно осведомлена та функция WinAPI, которая тебе его предоставила или которой ты его передашь.

При такой аналогии становится понятно, почему хэндлы нужно получать и освобождать. А уж API само разберется — заводить под него память или дать просто адрес, освобождать память при CloseHandle или ну его...

По аналогии — можно воспринимать классы как хэндлы, структура которых тебе известна.

Встречается еще аналогия, что HANDLE — это пароль, который тебе дают в одном месте, чтобы ты его произнес в другом и тебя пустили. Но это не объясняет, почему пароль нужно освобождать (CloseHandle).
/DVA
Re: Handle и все тут...
От: Diouzshev Россия  
Дата: 03.12.03 16:46
Оценка: 6 (1)
Hello, _silent!
You wrote on Wed, 03 Dec 2003 11:44:16 GMT:

s> Люди, может, подскажете тупому программеру — что такое HANDLE?

s> Уже и встречался и даже работал... Но что это такое, так и не знаю...
s> Странно, да? Вот и я так думаю. Объясните мне, пожалуйста.

И я свою лепту внесу

Handle — это дескриптор, уникальный код общедостоступного (так или иначе) объекта в OS Windows
Q: А почему бы не воспользоваться ссылкой на этот объект?
А: ОС работает в защищенном режиме и если для одного процесса хранится в некий объект по адресу, скажем $FFFF, а для другого процесса по этому адресу может быть все что угодно, но только не этот объект, да и вообще из другого процесса до этого адреса не достучишься, вот и придумали Handle. %).

With best regards, Alexander Diouzshev-Maltsev.
Posted via RSDN NNTP Server 1.8 beta
Re[2]: Handle и все тут...
От: Аноним  
Дата: 03.12.03 17:01
Оценка: 9 (1)
Попробую объяснить на пальцах.

На эпоху структурного программирования,
когда проектировалось большинство ОС,
вместо объектов и методов
использовались структуры и функции для работы с ними.

Напр.,
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;


Структура хэндла может быть составной — включать в себя
различные флаги и т.п.
Собственно, для реализация хэндла важно лишь уметь каким-то
образом получать по нему доступ к самому объект.
Re[2]: Handle и все тут...
От: Slicer [Mirkwood] Россия https://ru.linkedin.com/in/maksim-gumerov-039a701b
Дата: 03.12.03 17:58
Оценка: 6 (1)
Здравствуйте, Dmitry V.Abramov, Вы писали:

_>>Люди, может, подскажете тупому программеру — что такое HANDLE?

_>>Уже и встречался и даже работал... Но что это такое, так и не знаю... Странно, да? Вот и я так думаю. Объясните мне, пожалуйста.

DVA>Воспринимай его как универсальную ссылку (pointer) на некую структуру. Что это за структура, создана ли отдельно или является частью другой, — ты не знаешь. Но об этом прекрасно осведомлена та функция WinAPI, которая тебе его предоставила или которой ты его передашь.

Ты бы людей не путал словами pointer и ссылка — с непривычки еще поймут неправильно. Я бы сказал так: хендл, хотя официально это не регламентировано , — это идентификатор некоторой сущности. Одной сущности может соответствовать несколько идентификаторов.

DVA>При такой аналогии становится понятно, почему хэндлы нужно получать и освобождать.

Надо ли освобождать — зависит от сущности, чей идентификатор нас интересует. Если мы всего лишь пользуемся сущностью, созданной кем-то другим, то часто ничего освобождать не надо. Если же сущность находится в нашем владении (т.е. грубо говоря, мы ее создали, например, путем вызова ф-ии ОС, которая вернула хендл). Бывает, что владельцем сущности является ОС — тогда освобождать таки надо, но для того, чтобы ОС уменьшила счетчик ссылок на сущность и при достижении 0 удалила эту больше ненужную сущность (разумеется, некоторые сущности могут в из соображений оптимизации никогда не удаляться, если они используются часто — даже если счетчик достиг 0, можно предположить, что сущность "популярна" и ее скоро снова кто-то захочет поюзать).

Slicer
Специалист — это варвар, невежество которого не всесторонне :)
Re[2]: Handle и все тут...
От: Kluge  
Дата: 03.12.03 23:45
Оценка: 3 (1)
Здравствуйте, Diouzshev, Вы писали:

D>А: ОС работает в защищенном режиме и если для одного процесса хранится в некий объект по адресу, скажем $FFFF, а для другого процесса по этому адресу может быть все что угодно, но только не этот объект, да и вообще из другого процесса до этого адреса не достучишься, вот и придумали Handle. %).

А что бы окончательно внести ясность. Handle одного процесса в другом не действителен за исключением случаев когда мы специально ою этом позаботились.

В w2k Handle это смешение относительно начала таблицы Handle-ов процесса, в указанном месте начинается описание объекта ядра. Т.к. объект ядра может лежать и в памяти процесса и в памяти ядра давать на него указатель не разумно
Лоботомию в массы! (с)
Re[3]: Handle и все тут...
От: Аноним  
Дата: 04.12.03 07:16
Оценка: :)
Здравствуйте, Slicer [Mirkwood], Вы писали:

SM>Ты бы людей не путал словами pointer и ссылка — с непривычки еще поймут неправильно. Я бы сказал так: хендл, хотя официально это не регламентировано , — это идентификатор некоторой сущности. Одной сущности может соответствовать несколько идентификаторов.


Вот. Сразу все стало значительно понятней.

--
С уважением, LVT.

ЗЫ А кто такая сущность?
Re[4]: Handle и все тут...
От: Leonid Troyanovsky  
Дата: 04.12.03 07:20
Оценка:
Здравствуйте, All, мы писали:

А>Здравствуйте, Slicer [Mirkwood], Вы писали:


..

Sorry, это опять я забыл зарегистрироваться

--
С уважением, LVT.
--
С уважением, LVT
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.