Java 为什么`ReadFile()`返回错误87?
下面是Java代码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,
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的注释),因为此代码中没有错误检查。