Что такое дескриптор 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

2022-10-25T21:26:48+00:00
Вопросы с похожей тематикой, как у вопроса:

Что такое дескриптор Windows?