java 调用kernel32,向JNA类Java(Kernel32)添加另一个方法

I was trying to use a method from WIN32 dll, not included in JNA.

The Method is 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);

}

Using..

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

IntByReference dwType = new IntByReference();

lib.GetProductInfo(6,0,0,0,dwType);

switch (dwType.getValue()) {

// Something

}

But I need to use others methods implemented in 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);

}

Working with the code:

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

}

How I can to include a new method to Kernerl32 (already defined in JNA -> com.sun.jna.platform.win32.Kernel32)?

解决方案

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

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值