В чем разница между HANDLE и HFILE в WinAPI? - PullRequest
5 голосов
/ 26 ноября 2008

WinAPI Функция OpenFile возвращает HFILE, а GetFileTime, например, нуждается в HANDLE. Когда я кормлю его (HANDLE) some_hFile, кажется, что он работает нормально. Есть ли разница в этих типах, или один из них просто рудиментален?

Ответы [ 5 ]

8 голосов
/ 26 ноября 2008

OpenFile - это 16-битная функция обратной совместимости Windows. CreateFile - это функция для открытия файлов.

6 голосов
/ 26 ноября 2008

Если функция завершается успешно, HFILE - это файл HANDLE. Если нет, то это константа HFILE_ERROR (предположительно -1). Дело в том, что это не может быть HANDLE при ошибке, поэтому они возвращают что-то, что может быть HANDLE или значением ошибки.

См. Также предложение Барри.

3 голосов
/ 26 ноября 2008

Чтобы ответить на ваш вопрос, HANDLE - это просто беззнаковое 32-битное число, определенное как PVOID. Это общая ручка. HFILE является специализированным дескриптором, хотя и определяется как 32-битное число со знаком, чтобы иметь возможность получить значение -1. ​​
Существуют и другие специализированные дескрипторы, такие как HACCEL, HBITMAP, HINSTANCE и т. Д., Все они определены как зависимость от HANDLE.

2 голосов
/ 26 ноября 2008

Несколько лет назад HANDLES были 16-разрядными int с. Все дескрипторы везде в Windows были HANDLES. Затем кто-то понял, что файл HANDLE не совсем то же самое, что и окно HANDLE, и если бы они были определены по-разному, скажем, как HFILE и HWND, то, возможно, разработчики случайно не поменяют их как много. (Однако оба они были typedef 'int).

Позже кто-то понял, что если они были определены совершенно по-другому ... скажем как:

typedef struct _hfile {} * HFILE;
typedef struct _hwnd {} * HWND;

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

1 голос
/ 26 ноября 2008

OpenFile возвращает дескриптор файла в случае успеха или HFILE_ERROR в случае ошибки.

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