为什么`ReadFile()`返回错误87?

时间:2015-07-09 17:01:10

标签: java winapi jna

以下是Java代码。

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)

可能是什么问题?

1 个答案:

答案 0 :(得分:0)

您没有检查错误。你必须把它做对。文档解释了如何。阅读文档是无可替代的。

检查返回值。将hINVALID_HANDLE_VALUE进行比较。该值表示失败,如果是,只有这样,请致电GetLastError

文档说明了如何打开直接访问卷:

  

要成功调用,必须满足以下要求:

     
      
  • 来电者必须具有管理权限。有关更多信息,请参阅使用特殊权限运行。
  •   
  • dwCreationDisposition参数必须具有OPEN_EXISTING标志。
  •   
  • 打开卷或软盘时,dwShareMode参数必须具有FILE_SHARE_WRITE标志。
  •   

您未达到最终要求。可能不是第一个。

对于ReadFile的调用,您没有检查返回值。文档说:

  

返回值

     

如果函数成功,则返回值为非零(TRUE)。

     

如果函数失败或异步完成,则返回值为零(FALSE)。要获取扩展错误信息,请调用GetLastError函数。

您还需要确保执行扇区对齐读取。你没有这样做。

您对GetLastError的来电也是错误的。他们需要修复。请参阅此问题:How to make GetLastError reliably work with JNA?