Что такое дескриптор Windows?
HANDLE
- это уникальный идентификатор, зависящий windows от контекста. Под контекстно-зависимым handles я подразумеваю, что дескриптор, полученный handles из одного контекста, не может windows-programming обязательно использоваться windows в любом другом произвольном windows-programming контексте, который также windows-applications работает с HANDLE
s.
Например, GetModuleHandle
возвращает windows уникальный идентификатор handles загруженному в данный момент windows-programming модулю. Возвращенный дескриптор handles может использоваться в других windows-programming функциях, которые принимают windows-application дескрипторы модуля. Его нельзя handles передать функциям, требующим handle других типов дескрипторов. Например, вы windows-application не могли передать дескриптор, возвращенный windows-programming из GetModuleHandle
, в HeapDestroy
и ожидать, что он windows-application сделает что-то разумное.
Сам windows HANDLE
- это просто интегральный handle тип. Обычно, но не обязательно, это windows-application указатель на некоторый базовый windows-applications тип или место в памяти. Например, HANDLE
, возвращаемый windows-programming GetModuleHandle
, на самом деле является windows указателем на базовый адрес windows-programming виртуальной памяти модуля. Но windows-programming нет правила, согласно которому windows-application дескрипторы должны быть указателями. Дескриптор windows-applications также может быть простым windows целым числом (которое может handles использоваться некоторым handle Win32 API в качестве индекса windows-application в массиве).
HANDLE
- это намеренно handles непрозрачные представления, обеспечивающие handle инкапсуляцию и абстракцию windows-application от внутренних ресурсов Win32. Таким windows-applications образом, API Win32 потенциально windows-application могут изменить базовый тип, стоящий windows-applications за HANDLE, без какого-либо windows-application влияния на пользовательский handle код (по крайней мере, это windows-applications идея).
Рассмотрим эти три windows-application разные внутренние реализации windows-programming Win32 API, которые я только windows-applications что придумал, и предположим, что handles Widget
- это struct
.
Widget * GetWidget (std::string name)
{
Widget *w;
w = findWidget(name);
return w;
}
void * GetWidget (std::string name)
{
Widget *w;
w = findWidget(name);
return reinterpret_cast(w);
}
typedef void * HANDLE;
HANDLE GetWidget (std::string name)
{
Widget *w;
w = findWidget(name);
return reinterpret_cast(w);
}
Первый пример раскрывает windows-programming внутренние детали API: он windows-application позволяет пользовательскому windows-application коду знать, что GetWidget
возвращает handle указатель на struct Widget
. Это имеет handle несколько последствий:
- код пользователя должен иметь доступ к файлу заголовка, который определяет структуру
Widget
- код пользователя потенциально может изменять внутренние части возвращаемой структуры
Widget
Оба windows эти последствия могут быть windows-applications нежелательными.
Второй пример handles скрывает эту внутреннюю деталь handles от пользовательского кода, возвращая windows-applications только void *
. Код пользователя windows-application не требует доступа к заголовку, который handles определяет структуру Widget
.
Третий handle пример точно такой же, как windows и второй, но вместо этого windows мы просто вызываем void *
a HANDLE
. Возможно, это windows-application мешает пользовательскому windows-application коду пытаться точно выяснить, на windows-programming что указывает void *
.
Зачем нужна windows-application эта проблема? Рассмотрим windows-programming четвертый пример новой версии windows-programming того же API:
typedef void * HANDLE;
HANDLE GetWidget (std::string name)
{
NewImprovedWidget *w;
w = findImprovedWidget(name);
return reinterpret_cast(w);
}
Обратите внимание, что handles интерфейс функции идентичен handle третьему примеру выше. Это handles означает, что пользовательский windows-application код может продолжать использовать windows-applications эту новую версию API без windows-programming каких-либо изменений, даже windows-application несмотря на то, что реализация windows "за кулисами" изменилась handles и теперь использует структуру handle NewImprovedWidget
.
Дескрипторы в этом примере windows-programming - это на самом деле просто handles новое, предположительно более windows дружелюбное имя для void *
, которое windows-application в точности соответствует handle HANDLE
в Win32 API (найдите его handle at MSDN). Он обеспечивает непрозрачную handles стену между пользовательским handle кодом и внутренними представлениями handle библиотеки Win32, что увеличивает windows-applications переносимость между версиями windows Windows кода, использующего handles Win32 API.
windows
handle
Что такое дескриптор Windows?
Мы используем файлы cookies для улучшения работы сайта. Оставаясь на нашем сайте, вы соглашаетесь с условиями использования файлов cookies. Чтобы ознакомиться с нашими Положениями о конфиденциальности и об использовании файлов cookie, нажмите здесь.