Adding another method to JNA Class Java (Kernel32)(向 JNA Class Java (Kernel32) 添加另一种方法)
问题描述
我试图使用来自 WIN32 dll 的方法,但 JNA 中没有.
I was trying to use a method from WIN32 dll, not included in JNA.
方法是GetProductInfo
我在单独的项目和工作中尝试这个:
I try this in separate project and work:
  public interface Kernel32 extends Library {
    public boolean GetProductInfo(int dwOSMajorVersion,int dwOSMinorVersion,
        int dwSpMajorVersion, int dwSpMinorVersion, IntByReference pdwReturnedProductType);
  }  
使用..
    Kernel32 lib = (Kernel32) Native.loadLibrary("kernel32", Kernel32.class);
    IntByReference dwType = new IntByReference();
    lib.GetProductInfo(6,0,0,0,dwType);
    switch (dwType.getValue()) {
    // Something
    }
但我需要使用 JNA
import com.sun.jna.platform.win32.Kernel32;
import com.sun.jna.platform.win32.User32;
import com.sun.jna.platform.win32.WinBase;
import com.sun.jna.platform.win32.WinDef;
import com.sun.jna.platform.win32.WinNT;
import com.sun.jna.platform.win32.WinUser;
  public interface Kernel32 extends Library {
    Kernel32 INSTANCE = (Kernel32)Native.loadLibrary("kernel32", Kernel32.class);
    // I need to insert this method!!!
    public boolean GetProductInfo(int dwOSMajorVersion,int dwOSMinorVersion,
        int dwSpMajorVersion, int dwSpMinorVersion, IntByReference pdwReturnedProductType);
    // This snippet I think should not Needed, 
    //but if I remove this code this methods will not be recognized
    //but if I leave this code, it is not working properly!!!
    public void GetSystemInfo(WinBase.SYSTEM_INFO lpSystemInfo);
    public boolean GetVersionExA(WinNT.OSVERSIONINFOEX lpVersionInfo);
    public boolean GetVersionExA(WinNT.OSVERSIONINFO lpVersionInfo);
  }
使用代码:
  WinNT.OSVERSIONINFOEX osviex = new WinNT.OSVERSIONINFOEX();
  WinNT.OSVERSIONINFO osvi = new WinNT.OSVERSIONINFO();
  WinBase.SYSTEM_INFO si = new WinBase.SYSTEM_INFO();
  String major = "", sub = "";
  boolean bOsVersionInfoEx = Kernel32.INSTANCE.GetVersionExA(osviex);
  boolean bOsVersionInfo = Kernel32.INSTANCE.GetVersionExA(osvi);
  Kernel32.INSTANCE.GetSystemInfo(si);
  // If I declare newly (the old methods), these will not work fine (Bad result)!!! 
  System.out.println("osviex.dwPlatformId.intValue()"+osviex.dwPlatformId.intValue());
  System.out.println("osviex.dwMajorVersion.intValue()"+osviex.dwMajorVersion.intValue());
  System.out.println("osvi.dwPlatformId.intValue()"+osvi.dwPlatformId.intValue());
  System.out.println("osvi.dwMajorVersion.intValue()"+osvi.dwMajorVersion.intValue());
我需要这个方法的结果!!!
I need the result of this method!!!
  IntByReference dwType = new IntByReference();
  Kernel32.INSTANCE.GetProductInfo(6,0,0,0,dwType);
  switch (dwType.getValue()) {
  //... code
  }
如何在 Kernerl32 中包含一个新方法(已在 JNA -> com.sun.jna.platform.win32.Kernel32 中定义)?
推荐答案
这是扩展 JNA 平台映射定义的库的方式:
This is how you extend a library defined by JNA's platform mappings:
public interface Kernel32 extends com.sun.jna.platform.win32.Kernel32 {
    Kernel32 INSTANCE = (Kernel32)Native.loadLibrary("kernel32", Kernel32.class, com.sun.jna.win32.W32APIOptions.DEFAULT_OPTIONS);
    boolean GetProductInfo(int dwOSMajorVersion, int dwOSMinorVersion, int dwSpMajorVersion, int dwSpMinorVersion, IntByReference pdwReturnedProductType);
}
                        这篇关于向 JNA Class Java (Kernel32) 添加另一种方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:向 JNA Class Java (Kernel32) 添加另一种方法
				
        
 
            
        - 从 finally 块返回时 Java 的奇怪行为 2022-01-01
 - C++ 和 Java 进程之间的共享内存 2022-01-01
 - Eclipse 插件更新错误日志在哪里? 2022-01-01
 - Safepoint+stats 日志,输出 JDK12 中没有 vmop 操作 2022-01-01
 - 将log4j 1.2配置转换为log4j 2配置 2022-01-01
 - Java包名称中单词分隔符的约定是什么? 2022-01-01
 - 如何使用WebFilter实现授权头检查 2022-01-01
 - Jersey REST 客户端:发布多部分数据 2022-01-01
 - value & 是什么意思?0xff 在 Java 中做什么? 2022-01-01
 - Spring Boot连接到使用仲裁器运行的MongoDB副本集 2022-01-01
 
						
						
						
						
						