2015-05-28 7 views
1

Я пытался использовать метод из WIN32 dll, не включенный в JNA.Добавление другого метода в JNA Class Java (Kernel32)

Метод является GetProductInfo

Я стараюсь это в отдельный проект и работы:

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

мне нужен результат этого метода !!!

IntByReference dwType = new IntByReference(); 
    Kernel32.INSTANCE.GetProductInfo(6,0,0,0,dwType); 
    switch (dwType.getValue()) { 
    //... code 
    } 

Как я могу включить новый метод для Kernerl32 (уже определено в ЮНА -> com.sun.jna.platform.win32.Kernel32)?

ответ

2

Это, как вы расширяете библиотеку, определенное отображения платформ ЮНЫ в:

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

Спасибо, работы решения с броскомами -> (Kernel32) –