Есть ли способ проверить правильность дескриптора (файла)? - PullRequest
3 голосов
/ 05 января 2011

Есть ли способ проверить, действителен ли дескриптор, в моем случае возвращенный CreateFile?

Проблема, с которой я сталкиваюсь, состоит в том, что допустимый дескриптор файла, возвращаемый CreateFile (это не INVALID_HANDLE_VALUE), позже вызываетСбой WriteFile, и GetLastError утверждает, что это из-за недопустимого дескриптора.

Ответы [ 6 ]

2 голосов
/ 05 января 2011

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

См .: Добавление точки наблюдения (прерывание при изменении переменной)

1 голос
/ 13 марта 2013

Другие ответы важны для вашей конкретной проблемы.

Однако, если вы получили HANDLE и просто хотите выяснить, действительно ли это дескриптор открытого файла (в отличие, например, от дескриптора мьютекса или объекта GDI и т. Д.), Существует Функция Windows API GetFileInformationByHandle для этого.

В зависимости от разрешений, которые ваш дескриптор предоставляет вам для файла, вы также можете попробовать прочитать некоторые данные из него, используя ReadFile , или выполнить операцию нулевой записи, используя WriteFile с nNumberOfBytesToWrite установлен на 0.

1 голос
/ 05 января 2011

Ваша проблема, скорее всего, вызвана одной из двух причин:

  • Вы можете закрыть дескриптор файла, тем не менее, вы все еще пытаетесь использовать его
  • Дескриптор файла перезаписан из-за повреждения памяти

Как правило, рекомендуется присваивать INVALID_HANDLE_VALUE каждому дескриптору, если он не содержит допустимого значения дескриптора. Проще говоря - когда ваша переменная объявлена ​​- немедленно инициализируйте ее этим значением. А также запишите это значение в вашу переменную сразу после закрытия дескриптора файла.

Это даст вам представление (1) - попытка использовать дескриптор файла, который уже закрыт (или еще не был открыт) * ​​1012 *

0 голосов
/ 05 января 2011

Просто чтобы добавить к тому, что говорят все остальные, убедитесь, что вы проверяете возвращаемое значение при вызове CreateFile. IIRC вернет INVALID_HANDLE_VALUE в случае сбоя, после чего вам следует позвонить GetLastError, чтобы выяснить, почему.

0 голосов
/ 05 января 2011

Проверка валидности ручки - в лучшем случае лейкопластырь.

Вам следует отладить процесс - установить точку останова в точке, в которой установлен дескриптор (открытие файла), а когда вы нажимаете этот код и после того, как дескриптор установлен, установите вторую , условную точка останова для срабатывания при изменении значения дескриптора.

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

0 голосов
/ 05 января 2011

Open-File хранится в виде структуры данных в ядре, я не думаю, что у него есть официальный способ определить дескриптор файла, просто используйте его и отметьте код ошибки как INVALID_HANDLE.Вы уверены, что ни один другой поток не закрыл этот дескриптор файла?

...