使用 JNA 调用 CreateFile 会出现 UnsatisfiedLinkError: 查找函数“CreateFile”时出错: 找不到指定的过程

发布于 2024-12-04 16:38:25 字数 1412 浏览 1 评论 0原文

我正在尝试使用 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 的方式有问题。

有什么想法我做错了吗?


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

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

錯遇了你 2024-12-11 16:38:25

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

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

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

Kernel32 kernel32 = Kernel32.INSTANCE;

Windows API has ASCII and Unicode versions of functions (CreateFileA and CreateFileW), thus you need to specify which one do you want when calling loadLibrary():

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

Also, actually you don't need to call loadLibrary() manually:

Kernel32 kernel32 = Kernel32.INSTANCE;
苍风燃霜 2024-12-11 16:38:25

尝试写这样的函数


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

try writing function like this


HANDLE hDeviceUSB = Kernel32.INSTANCE.CreateFile(szCom,
                    GENERIC_READ | GENERIC_WRITE, 
                    0,              
                    null,          
                    OPEN_EXISTING,  
                    0,              
                    null);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文