xiannvytt 2024-03-15 18:38 采纳率: 50%
浏览 16

利用JNA获取process时报错

我想要获取窗口标题以及窗口中的process,我在csdn中找到了代码,在复现过程中发生许多问题:
以下为代码原链接:
https://blog.csdn.net/weixin_42313675/article/details/114117847?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171014117316800180696869%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=171014117316800180696869&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-6-114117847-null-null.142^v99^pc_search_result_base4&utm_term=%E8%8E%B7%E5%8F%96%E5%BD%93%E5%89%8D%E7%AA%97%E5%8F%A3%20java&spm=1018.2226.3001.4187

在执行语句: Pointer process = Kernel32.OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, false, pointer.getValue());

报错缺少动态库:

A fatal error has been detected by the Java Runtime Environment: # # EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ffd28fc52ac, pid=6124, tid=0x00000000000017ac # # JRE version: Java(TM) SE Runtime Environment (8.0_401) (build 1.8.0_401-b10) # Java VM: Java HotSpot(TM) 64-Bit Server VM (25.401-b10 mixed mode windows-amd64 compressed oops) # Problematic frame: # C [ntdll.dll+0x352ac]

我分别尝试了以下方案:

1、以为是jvm配置有问题,增加了虚拟机的内存空间:
https://www.cnblogs.com/jokingremarks/p/15132599.html
2、下载驱动精灵 ,更新驱动:
https://blog.csdn.net/luguangxu68/article/details/38977197
但是因为我是服务器 配置位Windows server 2012 所以驱动精灵有问题下载不了,感谢以下链接帮助了我解决:
https://blog.csdn.net/qq_32965233/article/details/129036082

3、但是后续又报一下错误:
Exception in thread "main" java.lang.ExceptionInInitializerError
at org.example.EnumerateWindows.main(EnumerateWindows.java:34)
Caused by: java.lang.IllegalArgumentException: Invalid calling convention 63

以上都没有解决我的问题:
目前我面临的保持是:
Exception in thread "main" java.lang.ExceptionInInitializerError
at org.example.EnumerateWindows.main(EnumerateWindows.java:32)
Caused by: java.lang.IllegalArgumentException: Invalid calling convention 63
at com.sun.jna.Native.registerMethod(Native Method)

请问有人遇到过相似的问题吗?希望能给我解答,谢谢大家!

  • 写回答

3条回答 默认 最新

  • 关注

    xiannvytt 晚上好🌙🌙🌙
    本答案参考ChatGPT-3.5

    根据你提供的信息,你在使用JNA获取进程信息时遇到了问题。具体而言,在执行以下代码时出现了问题:

    Pointer process = Kernel32.OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, false, pointer.getValue());
    

    错误信息显示缺少动态库,这可能导致了访问违规。为了解决这个问题,可以尝试以下解决方案:

    1. 确认动态库文件是否存在:确保所需的动态库文件(例如ntdll.dll)在系统中存在。如果缺少这些文件,你可以通过重新安装JDK或Windows系统来恢复它们。

    2. 检查JNA配置:确保已正确配置JNA库。请检查你的代码中是否包含正确的JNA库依赖项,并将其添加到类路径中。

    3. 使用合适的调用约定:异常信息中提到了“Invalid calling convention”错误。这通常是由于使用不匹配的调用约定引起的。在你的代码中,请确保在调用OpenProcess函数时使用了正确的调用约定。通常情况下,Windows API使用StdCall调用约定:

      Kernel32 kernel32 = Kernel32.INSTANCE;
      DWORD dwDesiredAccess = new DWORD(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ);
      HANDLE process = kernel32.OpenProcess(dwDesiredAccess, false, pointer.getValue());
      

      请注意,上述代码使用了JNA的自动生成代码来调用OpenProcess函数。

    4. 尝试以管理员身份运行程序:有时,某些进程可能需要管理员权限才能访问。因此,尝试以管理员身份运行程序可能会解决问题。

    综上所述,你可以尝试以下解决方案来解决问题:

    1. 确认动态库文件是否存在。
    2. 检查JNA库的配置。
    3. 使用正确的调用约定调用OpenProcess函数。
    4. 尝试以管理员身份运行程序。

    如果你在尝试这些解决方案后仍然遇到问题,请提供相关的代码以供进一步分析和帮助。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月15日

悬赏问题

  • ¥15 代码在keil5里变成了这样怎么办啊,文件图像也变了,
  • ¥20 Ue4.26打包win64bit报错,如何解决?(语言-c++)
  • ¥15 clousx6整点报时指令怎么写
  • ¥30 远程帮我安装软件及库文件
  • ¥15 关于#自动化#的问题:如何通过电脑控制多相机同步拍照或摄影(相机或者摄影模组数量大于60),并将所有采集的照片或视频以一定编码规则存放至规定电脑文件夹内
  • ¥20 深信服vpn-2050这台设备如何配置才能成功联网?
  • ¥15 Arduino的wifi连接,如何关闭低功耗模式?
  • ¥15 Android studio 无法定位adb是什么问题?
  • ¥15 C#连接不上服务器,
  • ¥15 angular项目错误