使用 JNA 调用 CreateFile 会出现 UnsatisfiedLinkError: 查找函数“CreateFile”时出错: 找不到指定的过程
我正在尝试使用 JNA 在 Windows 7 上调用 Win32 的 CreateFile 函数,目的是实现 这个答案用于检查文件是否正在被另一个进程使用。
到目前为止,我的代码是:
import com.sun.jna.Native;
import com.sun.jna.examples.win32.Kernel32;
public class CreateFileExample {
static int GENERIC_ACCESS = 268435456;
static int EXCLUSIVE_ACCESS = 0;
static int OPEN_EXISTING = 3;
public static void main(String[] args) {
Kernel32 kernel32 =
(Kernel32) Native.loadLibrary("kernel32", Kernel32.class);
kernel32.CreateFile("c:\\file.txt", GENERIC_ACCESS, EXCLUSIVE_ACCESS,
null, OPEN_EXISTING, 0, null);
}
}
但是,运行此代码会引发异常:
java.lang.UnsatisfiedLinkError: 查找函数“CreateFile”时出错:找不到指定的过程。
如果我更改 “kernel32”
在 loadLibrary
调用无效的内容,然后我得到 无法找到指定的模块
所以这表明 DLL 被正确找到从图书馆路径,但我调用 CreateFile 的方式有问题。
有什么想法我做错了吗?
CreateFile
在 com.sun.jna.examples.win32.Kernel32
中定义为:
public abstract com.sun.jna.examples.win32.W32API.HANDLE CreateFile(
java.lang.String arg0,
int arg1,
int arg2,
com.sun.jna.examples.win32.Kernel32.SECURITY_ATTRIBUTES arg3,
int arg4,
int arg5,
com.sun.jna.examples.win32.W32API.HANDLE arg6);
I'm trying to call Win32's CreateFile
function on Windows 7 using JNA with the aim being to do a Java implementation of this answer to checking if a file is in use by another process.
The code I have so far is:
import com.sun.jna.Native;
import com.sun.jna.examples.win32.Kernel32;
public class CreateFileExample {
static int GENERIC_ACCESS = 268435456;
static int EXCLUSIVE_ACCESS = 0;
static int OPEN_EXISTING = 3;
public static void main(String[] args) {
Kernel32 kernel32 =
(Kernel32) Native.loadLibrary("kernel32", Kernel32.class);
kernel32.CreateFile("c:\\file.txt", GENERIC_ACCESS, EXCLUSIVE_ACCESS,
null, OPEN_EXISTING, 0, null);
}
}
However, running this raises the exception:
java.lang.UnsatisfiedLinkError: Error looking up function 'CreateFile': The specified procedure could not be found.
If I change "kernel32"
in the loadLibrary
call to something invalid then instead I get The specified module could not be found
so this suggests that the DLL is being found correctly from the library path, but there's something wrong with the way I'm calling CreateFile
.
Any ideas what I'm doing wrong?
CreateFile
is defined in com.sun.jna.examples.win32.Kernel32
as:
public abstract com.sun.jna.examples.win32.W32API.HANDLE CreateFile(
java.lang.String arg0,
int arg1,
int arg2,
com.sun.jna.examples.win32.Kernel32.SECURITY_ATTRIBUTES arg3,
int arg4,
int arg5,
com.sun.jna.examples.win32.W32API.HANDLE arg6);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
Windows API 有 ASCII 和 Unicode 版本的函数(
CreateFileA
和CreateFileW
),因此您需要在调用loadLibrary()
时指定要使用哪一个版本>:另外,实际上你不需要手动调用
loadLibrary()
:Windows API has ASCII and Unicode versions of functions (
CreateFileA
andCreateFileW
), thus you need to specify which one do you want when callingloadLibrary()
:Also, actually you don't need to call
loadLibrary()
manually:尝试写这样的函数
try writing function like this