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

Java 为什么`ReadFile()`返回错误87?,java,winapi,jna,Java,Winapi,Jna,下面是Java代码 HANDLE h = kernel32.CreateFile("\\\\.\\d:", kernel32.GENERIC_READ | kernel32.GENERIC_WRITE, 0, null, kernel32.OPEN_EXISTING,

下面是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(无效参数)


可能是什么问题?

您没有检查错误。你必须纠正这一点。该文档解释了如何使用。阅读文档是无可替代的

检查返回值。将
h
无效的\u句柄\u值进行比较
。该值表示失败,如果是,并且仅是如此,则调用
GetLastError

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

要使此类呼叫成功,必须满足以下要求:

  • 调用方必须具有管理权限。有关详细信息,请参阅以特殊权限运行
  • dwCreationDisposition参数必须具有OPEN_EXISTING标志
  • 打开卷或软盘时,dwShareMode参数必须具有FILE_SHARE_WRITE标志
你没有达到最终要求。可能不是第一次

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

返回值

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

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

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


您对
GetLastError
的调用也错误。它们需要修复。请参阅此问题:

哪一行是第87行?最有可能的是无效参数是第一行。如果您试图打开
D:
驱动器的根目录,请改用
“D:/”
,并在调用后检查错误代码。您还应该确保48个字节足以读取您正在读取的任何文件的内容。除非您确实遇到了错误,否则调用
GetLastError()
是无效的,并且没有证据表明您确实遇到了错误。@technomage:
“\\\\\.\\d:“
CreateFile()
的完全有效的路径字符串:打开卷或可移动媒体驱动器(例如软盘驱动器或闪存拇指驱动器)时,lpFileName字符串应为以下形式:“\\。\X:”。不要使用尾随的反斜杠(),它表示驱动器的根目录。“更可能发生的情况是,
CreateFile()
出现故障,并且一个无效的
句柄正在传递给
ReadFile()
。假设
ReadFile()
甚至在一开始就出现故障(根据EJP的注释),因为此代码中没有错误检查。