Windows HANDLES - 32-разрядные целые числа без знака? - PullRequest
0 голосов
/ 28 мая 2019

за https://en.wikibooks.org/wiki/Windows_Programming/Handles_and_Data_Types#HANDLE,

РУЧКИ определены как 32-разрядные числа без знака в windows.h

Однако в WinDef.h мы видим следующее:

DECLARE_HANDLE            (HWND);

и в winnt.h мы видим следующее:

#ifdef STRICT
typedef void *HANDLE;
#if 0 && (_MSC_VER > 1000)
#define DECLARE_HANDLE(name) struct name##__; typedef struct name##__ *name
#else
#define DECLARE_HANDLE(name) struct name##__{int unused;}; typedef struct name##__ *name
#endif
#else
typedef PVOID HANDLE;
#define DECLARE_HANDLE(name) typedef HANDLE name
#endif

Это говорит мне о том, что дескрипторы окон - это простые указатели. Мне кажется, это означает, что максимальный размер дескриптора окна зависит от максимального размера адресуемой памяти, который в большинстве новых машин составляет 64 бита. Что мне не хватает?

1 Ответ

0 голосов
/ 29 мая 2019

Дескриптор - это указатель на указатель на ресурс в пространстве ядра.

При использовании: РУЧКА похожа на указатели. 32 бита на 32-битной машине, 64 бита на 64-битной машине и имеют атрибуты unsigned:

HANDLE h = (HANDLE)-1;
if (h < 0)
    cout << "<";
else
    cout << ">";

результат: ">" (оба в 32/64-битном)

В смысле использования:

значимы только младшие 32 бита, поэтому можно обрезать обрабатывать (при переходе от 64-разрядного к 32-разрядному) или расширять знак дескриптор (при передаче из 32-битного в 64-битный режим).

В этом FAQ также описывается, что такое дескриптор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...