2015-07-09 6 views
0

Ниже приведен код Java.Почему `ReadFile()` возвращает ошибку 87?

HANDLE h = kernel32.CreateFile("\\\\.\\d:", 
           kernel32.GENERIC_READ 
           | kernel32.GENERIC_WRITE, 
           0, null, kernel32.OPEN_EXISTING, 
           0, null); 

IntByReference nbread = new IntByReference(); 

ByteBuffer b = ByteBuffer.allocate(48); 

boolean result = kernel32.ReadFile(h, b, b.capacity(), nbread, null); 

System.out.println(kernel32.GetLastError()); 

это дает ошибку 87 (Invalid parameter)

Что может быть проблема?

+0

какая линия линия 87? – frgnvola

+0

Скорее всего, неверный параметр является первым. Если вы пытаетесь открыть корневую директорию диска 'D: ', используйте вместо этого' 'D: /" 'и проверьте код ошибки после вызова _that_. Вы также должны убедиться, что достаточно 48 байт, чтобы прочитать содержимое любого файла, который вы читаете. – technomage

+1

Недействительно вызывать 'GetLastError()', если у вас на самом деле нет ошибки, и нет никаких доказательств, которые вы сделали. – EJP

ответ

0

Вы не проверяете ошибки. Вы должны это исправить. В документации объясняется, как. Нет никакой замены для чтения документации.

Проверьте значения возврата. Сравнить h от INVALID_HANDLE_VALUE. Это значение указывает на сбой, и если да, и только так, вызовите GetLastError.

В документации сказано, это об открытии тома для прямого доступа:

Следующие требования должны быть выполнены для такого вызова, чтобы добиться успеха:

  • Вызывающий должен иметь права администратора. Дополнительные сведения см. В разделе Работа со специальными привилегиями.
  • Параметр dwCreationDisposition должен иметь флаг OPEN_EXISTING.
  • При открытии тома или гибкого диска параметр dwShareMode должен иметь флаг FILE_SHARE_WRITE.

Вы не отвечаете окончательным требованиям. И, возможно, не первый.

Что касается вызова ReadFile, вы не проверяете возвращаемое значение. В документации сказано:

Возвращаемое значение

Если функция завершается успешно, возвращаемое значение равно нулю (TRUE).

Если функция не работает или выполняется асинхронно, возвращаемое значение равно нулю (FALSE). Чтобы получить расширенную информацию об ошибке, вызовите функцию GetLastError.

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

Ваши звонки в GetLastError неверны. Они должны быть исправлены. См. Этот вопрос: How to make GetLastError reliably work with JNA?

Смежные вопросы