Тестирование недействительного дескриптора Windows: следует ли сравнивать с "NULL", "0" или даже "nullptr"?

Я исхожу из фона, в котором указатели обычно следует сравнивать с "NULL" и целыми числами с "0".

Поскольку я не воспринимал дескрипторы Windows как "указатели" в чистом смысле (будучи "ручками" ), я привык сравнивать их с 0, а не с "NULL".

Очевидно, что они реализованы внутренне как указатели в настоящее время, но я лично считаю, что это просто для получения некоторой безопасности типа, а не потому, что они являются внутренне указателями.

В любом случае, я просто заметил, что помощь для CreateIC, которая возвращает HDC, утверждает, что если функция не работает, она возвращает "NULL".

Теперь я запутался - и мне интересно, что считают другие люди - правильнее ли считать дескриптор Windows указателем (и, следовательно, проверить его против "NULL" или "nullptr" для современных компиляторов) или он должен считаться целым числом?

Ответ 1

Сравните его с документированным значением возврата ошибки. Это означает, что вы должны сравнивать его с INVALID_HANDLE, 0, -1, отличным от нуля или <=32 (я не шучу с последним, см. ShellExecute).

Ответ 2

Чтобы ответить на ваш вопрос: тип HANDLE объявлен в winnt.h как

typedef PVOID HANDLE;

Следовательно, технически это указатель.

Однако я бы просто использовал все, что задокументировано; если в документации указано, что возвращается NULL, я использую именно это, если только доказательства не показывают, что документация неверна.

Я даже не думаю о указателях и целых числах. NULL - это просто непрозрачное значение (в этой ситуации), а HANDLE - непрозрачный тип для меня, и я не ищу, чтобы посмотреть, что это такое #define 'd.

Ответ 3

Я думаю, что INVALID_HANDLE_VALUE обычно является правильным "недопустимым" значением для дескрипторов Windows... и это оценивается как -1.