Что такое хэндл?

Тема в разделе "WASM.BEGINNERS", создана пользователем Shoorup, 19 май 2008.

  1. Shoorup

    Shoorup Member

    Публикаций:
    0
    Регистрация:
    20 сен 2007
    Сообщения:
    109
    Подскажите, что такое хэндл или где найти расширенную информацию по данной теме.
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    у процесса есть таблица объектов, с которыми он работает, например, открытые файлы, окна или сокеты.
    Чтобы идентифицировать объект используется хендл - можно сказать, что это индекс в таблице объектов.
    Когда ты открываешь файл через CreateFile (например), она тебе возвращает хендл этого файла. Далее, для всех операций с этим файлом ты передаешь операционной системе его хендл. Из таблицы вынимается соответствующий этому хендлу объект (а именно FILE_OBJECT, но тебе это знать не обязательно сейчас) и файловая система теперь знает, какой файл имелся в виду.

    В какой-то литературе видел (может быть не совсем удачное) сравнение хендла и ярлычка в гардеробе =)
     
  3. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    хендл-некий описатель объекта, через который производятся операции с данным объектом.
     
  4. Shoorup

    Shoorup Member

    Публикаций:
    0
    Регистрация:
    20 сен 2007
    Сообщения:
    109
    Спасибо за ответы. Примерно я все так и представлял. Просто хотел узнать более подробно все это. Поэтому и спросил где почитать.
    Если кому не лень напишите более бодробно или подскажите где почитать.
     
  5. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    В общем случае хэндл - это действительно "некий описатель", т.к. одни хэндлы ("глобальные") представляют собой некие индексы или хэши в соотв.таблицах ОС, а другие ("частные" или "приватные") просто указатели на некие структуры в адресном пр-ве процесса, например, hModule, hHeap, hGlobal
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    ModuleHandle и HeapHandle это псевдохэндлы, о них ядро ничего не знает.
     
  7. masm32

    masm32 New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2008
    Сообщения:
    147
    handle рабочего стола - 0

    Что вы имеете сказать по этому поводу, уважаемые?
     
  8. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Clerk
    Угу, только это не ядерная ветка, а бегинерская ;)
    Мелкософты в платформ-сдк "псевдохэндлами" называют спецконстанты, возвращаемые GetCurrentProcess\Thread и т.п., а hModule и hHeap "обзывают" просто хэндлами, чтобы вызвать побольше вопросов у любознательных бегинеров ;)
     
  9. Shoorup

    Shoorup Member

    Публикаций:
    0
    Регистрация:
    20 сен 2007
    Сообщения:
    109
    Да! Бегинер из меня очень любопытный!:) Если честно, то из того, что вы написали я ничего толком не понял. Такое ощущение, что вы просто припомнили для себя что-то, и посоревновались кто позаумней скажет:)
    Самый понятный первый ответ (пост №2). Но сразу появляется дополнительные вопросы из непонятных слов:) Помог гугл как ни странно. В итоге пришел я к литературе "Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows - Джефри Рихтер"-глава 3. Если не поможет буду спрашивать.
     
  10. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    hModule - указатель на адрес загрузки, я не понимаю причём тут дескрипторы..
     
  11. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Clerk
    При чем тут дескрипторы я тоже не понял, т.к. вопрос про хэндлы :)

    Пример из мсдн
    И кстати ни слова о том, что этот хэндл = адресу загрузки образа. Поэтому для тех, кто еще "в танке", это просто некий хэндл, а для тех, кто уже "в курсе" это еще и адрес загрузки. То же самое относится и к hHeap (GetProcessHeap), hGlobal (GloabalAlloc, GetClipboardData)

    Shoorup
    Я просто пояснил, что в АПИ хэндлами "обзываются" не только описатели объектов ядра, но и некоторые "штуки", принадлежащие процессу. В частности hModule,hHeap,hGlobal "на самом деле" являются указателями, но мелкософты это дело не афишируют и выдают за "некие хэндлы"
     
  12. Shoorup

    Shoorup Member

    Публикаций:
    0
    Регистрация:
    20 сен 2007
    Сообщения:
    109
    Чуть глубже хочу копнуть чтоб хотябы в общих чертах понять как все работает. Не совсем понимаю что за объекты ядра. Понимаю так: допустим я пишу программу которая выводит окно. Я обращаюсь к некоторым функциям. Функции в свою очередь обращаются к хэндлам отвечающие за работу окна. А хэндл обращается к ядру. ... Бред написал.... поправьте бигинера.
     
  13. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Все объекты (окно, открытый файл, синхронизирующий event, порт, и т. п.) в ядре представляюся некими структурами с данными (например, гурбо говоря, FILE_OBJECT - объект "файл", обозначаюший открытый файл, содержит текущее смещение в файле и некие данные для ядра, чтобы оно знало, где этот файл искать в случае чего), указатели на все эти структуры-объекты записываются в таблицу объектов, она своя у каждого процесса. Так же в этой таблице записано, с какими правами открыт объект. Например, нельзя писать в файл, открытый на чтение. Эта проверка идет именно в этом месте, когда извлекается указатель на объект по его хендлу внутри ядра.
    Хендл это номер в этой таблице (тоже, грубо говоря. там еще служебные биты есть).
    Например, ты открываешь файл, создается объект FILE_OBJECT ядра, и его адрес записывается на 10ю строчку таблицы объектов твоего процесса. CreateFile возвращает 10.
    (опять же, пример отвлеченный, на самом деле не весь хендл содержит индекс).