使用JNA调用CreateFile会产生UnsatisfiedLinkError:查找函数'CreateFile'时出错:找不到指定的过程

时间:2011-09-13 09:50:37

标签: java jna createfile

我正在尝试使用JNA在Windows 7上调用Win32的CreateFile函数,目的是执行this answer的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: Error looking up function 'CreateFile': The specified procedure could not be found.

如果我将"kernel32"调用中的loadLibrary更改为无效的内容,那么我得到The specified module could not be found,这样就可以从库路径中找到正确的DLL,但是出现了错误我打电话的方式是CreateFile

任何想法我做错了什么?


CreateFilecom.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);

2 个答案:

答案 0 :(得分:6)

Windows API具有ASCII和Unicode版本的函数(CreateFileACreateFileW),因此您需要在调用loadLibrary()时指定您想要的那个:

Kernel32 kernel32 = 
    (Kernel32) Native.loadLibrary("kernel32", Kernel32.class, W32APIOptions.UNICODE_OPTIONS); 

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

Kernel32 kernel32 = Kernel32.INSTANCE;

答案 1 :(得分:0)

尝试写这样的功能


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