Java 使用JNA调用CreateFile会产生不满意的LinkError:Error查找函数';创建文件';:找不到指定的过程

Java 使用JNA调用CreateFile会产生不满意的LinkError:Error查找函数';创建文件';:找不到指定的过程,java,jna,createfile,Java,Jna,Createfile,我试图在Windows7上使用JNA调用Win32的CreateFile函数,目的是执行的Java实现,以检查另一个进程是否正在使用一个文件 到目前为止,我掌握的代码是: import com.sun.jna.Native; import com.sun.jna.examples.win32.Kernel32; public class CreateFileExample { static int GENERIC_ACCESS = 268435456; static int

我试图在Windows7上使用JNA调用Win32的
CreateFile
函数,目的是执行的Java实现,以检查另一个进程是否正在使用一个文件

到目前为止,我掌握的代码是:

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”
更改为无效的内容,则取而代之的是
无法找到指定的模块
,因此这表明从库路径正确找到了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);

Windows API有ASCII和Unicode版本的函数(
CreateFileA
CreateFileW
),因此在调用
loadLibrary()
时需要指定所需的函数:

另外,实际上您不需要手动调用
loadLibrary()

Kernel32 kernel32 = Kernel32.INSTANCE;

尝试这样编写函数


HANDLE hDeviceUSB = Kernel32.INSTANCE.CreateFile(szCom,
                    GENERIC_READ | GENERIC_WRITE, 
                    0,              
                    null,          
                    OPEN_EXISTING,  
                    0,              
                    null);

感谢您,并感谢您提供的关于不需要手册
加载库
的提示。

HANDLE hDeviceUSB = Kernel32.INSTANCE.CreateFile(szCom,
                    GENERIC_READ | GENERIC_WRITE, 
                    0,              
                    null,          
                    OPEN_EXISTING,  
                    0,              
                    null);