Может ли CreateFile когда-либо возвращать NULL? - PullRequest
6 голосов
/ 23 ноября 2011

Я знаю, что недействительным значением, возвращаемым CreateFile, является INVALID_HANDLE_VALUE.Но так как я также люблю использовать RAII, очень заманчиво просто вставить HANDLE в shared_ptr (например: shared_ptr<void> handle (CreateFile(args),&CloseHandle)), чтобы убедиться, что дескриптор закрыт.Моя единственная проблема, связанная с этим быстрым и простым способом создания RAII, заключается в том, может ли CreateFile вернуть значение NULL в качестве значения HANDLE.

Ответы [ 3 ]

8 голосов
/ 23 ноября 2011

NULL не является допустимым значением дескриптора.Это можно заметить по тому факту, что некоторые функции Windows API возвращают NULL, чтобы указать на сбой.Поскольку существует одна функция для удаления дескрипторов, CloseHandle, из этого следует, что NULL не является допустимым значением HANDLE.Следовательно, CreateFile никогда не сможет вернуть NULL.

Раймонд Чен написал статью в блоге, касающуюся этой темы: Почему возвращаемые значения HANDLE настолько противоречивы? .

СейчасЯ ничего не знаю о shared_ptr<>, поэтому не хотел бы комментировать, подходит ли ваша идея.Я просто отвечаю на прямой вопрос, который вы задали.

1 голос
/ 23 ноября 2011

При тестировании РУЧКИ на валидность общим способом проверьте оба значения: NULL и INVALID_HANDLE_VALUE.

Но я не понимаю, как RAII имеет какое-либо отношение к тому, может ли CreateFile вернуть NULL. Вам нужно будет предоставить пользовательский код для проверки правильности и освобождения, чтобы HANDLE работал с общим указателем, поэтому вы управляете этими проверками, а не классом общего указателя.

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

0 голосов
/ 23 ноября 2011

CreateFile никогда не возвращает NULL. Я предлагаю вам использовать уже созданную оболочку ATL::CAtlFile и не изобретать новую, основанную на shared_ptr.

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