向JNA类Java(Kernel32)添加另一种方法 [英] Adding another method to JNA Class Java (Kernel32)
本文介绍了向JNA类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类Java(Kernel32)添加另一种方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文