向 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);
}
相关文章