у процесса есть таблица объектов, с которыми он работает, например, открытые файлы, окна или сокеты. Чтобы идентифицировать объект используется хендл - можно сказать, что это индекс в таблице объектов. Когда ты открываешь файл через CreateFile (например), она тебе возвращает хендл этого файла. Далее, для всех операций с этим файлом ты передаешь операционной системе его хендл. Из таблицы вынимается соответствующий этому хендлу объект (а именно FILE_OBJECT, но тебе это знать не обязательно сейчас) и файловая система теперь знает, какой файл имелся в виду. В какой-то литературе видел (может быть не совсем удачное) сравнение хендла и ярлычка в гардеробе =)
Спасибо за ответы. Примерно я все так и представлял. Просто хотел узнать более подробно все это. Поэтому и спросил где почитать. Если кому не лень напишите более бодробно или подскажите где почитать.
В общем случае хэндл - это действительно "некий описатель", т.к. одни хэндлы ("глобальные") представляют собой некие индексы или хэши в соотв.таблицах ОС, а другие ("частные" или "приватные") просто указатели на некие структуры в адресном пр-ве процесса, например, hModule, hHeap, hGlobal
Clerk Угу, только это не ядерная ветка, а бегинерская Мелкософты в платформ-сдк "псевдохэндлами" называют спецконстанты, возвращаемые GetCurrentProcess\Thread и т.п., а hModule и hHeap "обзывают" просто хэндлами, чтобы вызвать побольше вопросов у любознательных бегинеров
Да! Бегинер из меня очень любопытный! Если честно, то из того, что вы написали я ничего толком не понял. Такое ощущение, что вы просто припомнили для себя что-то, и посоревновались кто позаумней скажет Самый понятный первый ответ (пост №2). Но сразу появляется дополнительные вопросы из непонятных слов Помог гугл как ни странно. В итоге пришел я к литературе "Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows - Джефри Рихтер"-глава 3. Если не поможет буду спрашивать.
Clerk При чем тут дескрипторы я тоже не понял, т.к. вопрос про хэндлы Пример из мсдн И кстати ни слова о том, что этот хэндл = адресу загрузки образа. Поэтому для тех, кто еще "в танке", это просто некий хэндл, а для тех, кто уже "в курсе" это еще и адрес загрузки. То же самое относится и к hHeap (GetProcessHeap), hGlobal (GloabalAlloc, GetClipboardData) Shoorup Я просто пояснил, что в АПИ хэндлами "обзываются" не только описатели объектов ядра, но и некоторые "штуки", принадлежащие процессу. В частности hModule,hHeap,hGlobal "на самом деле" являются указателями, но мелкософты это дело не афишируют и выдают за "некие хэндлы"
Чуть глубже хочу копнуть чтоб хотябы в общих чертах понять как все работает. Не совсем понимаю что за объекты ядра. Понимаю так: допустим я пишу программу которая выводит окно. Я обращаюсь к некоторым функциям. Функции в свою очередь обращаются к хэндлам отвечающие за работу окна. А хэндл обращается к ядру. ... Бред написал.... поправьте бигинера.
Все объекты (окно, открытый файл, синхронизирующий event, порт, и т. п.) в ядре представляюся некими структурами с данными (например, гурбо говоря, FILE_OBJECT - объект "файл", обозначаюший открытый файл, содержит текущее смещение в файле и некие данные для ядра, чтобы оно знало, где этот файл искать в случае чего), указатели на все эти структуры-объекты записываются в таблицу объектов, она своя у каждого процесса. Так же в этой таблице записано, с какими правами открыт объект. Например, нельзя писать в файл, открытый на чтение. Эта проверка идет именно в этом месте, когда извлекается указатель на объект по его хендлу внутри ядра. Хендл это номер в этой таблице (тоже, грубо говоря. там еще служебные биты есть). Например, ты открываешь файл, создается объект FILE_OBJECT ядра, и его адрес записывается на 10ю строчку таблицы объектов твоего процесса. CreateFile возвращает 10. (опять же, пример отвлеченный, на самом деле не весь хендл содержит индекс).