2017-01-29 10 views
1

Я пытаюсь получить некоторую информацию из установки Windows. Я смог сделать это легко с помощью кода ниже на C#, но я ищу реализацию Java.Как использовать kernel32.dll в Java

Мне нужно иметь доступ к следующим переменным и методам:

internal struct OSVERSIONINFOEX 
    { 
     public Int32 dwOSVersionInfoSize; 
     public Int32 dwMajorVersion; 
     public Int32 dwMinorVersion; 
     public Int32 dwBuildNumber; 
     public Int32 dwPlatFormId; 

     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] 
     public String szCSDVersion; 

     public short wServicePackMajor; 
     public short wServicePackMinor; 
     public short wSuiteMask; 
     public byte wProductType; 
     public byte wReserved; 
    } 

    [DllImport("kernel32.dll")] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    internal static extern Boolean GetVersionEx(ref OSVERSIONINFOEX osVersionInfo); 

    [DllImport("kernel32.dll")] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    internal static extern Boolean GetProductInfo(
     [In] Int32 dwOSMajorVersion, 
     [In] Int32 dwOSMinorVersion, 
     [In] Int32 dwSpMajorVersion, 
     [In] Int32 dwSpMinorVersion, 
     [Out] out Int32 pdwReturnedProductType); 

    [DllImport("user32.dll")] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    internal static extern Boolean GetSystemMetrics([In] Int32 nIndex); 
+2

Вам понадобится один из [JNI] (http://docs.oracle.com/javase/8/docs/technotes/guide/jni /) * или * [JNA] (https://github.com/java-native-access/jna). –

+0

Спасибо, я это понял. Я скоро отвечу на свой вопрос. –

ответ

1

После более некоторые исследования здесь, как выполнить поставленную задачу. Вы должны использовать библиотеку JNA.

public interface Kernel32 extends com.sun.jna.platform.win32.Kernel32 { 
    // Method declarations, constant and structure definitions go here 

    Kernel32 INSTANCE = (Kernel32) 
      Native.loadLibrary("kernel32", Kernel32.class, com.sun.jna.win32.W32APIOptions.DEFAULT_OPTIONS); 

    boolean GetVersionEx(WinNT.OSVERSIONINFOEX osVersionInfo); 

    boolean GetProductInfo(
    int dwOSMajorVersion, 
    int dwOSMinorVersion, 
    int dwSpMajorVersion, 
    int dwSpMinorVersion, 
    IntByReference pdwReturnedProductType); 

    boolean GetSystemMetrics(int nIndex); 
} 

public static boolean GetVersionInfo(WinNT.OSVERSIONINFOEX osVersionInfo) { 
    return Kernel32.INSTANCE.GetVersionEx(osVersionInfo); 
} 

Чтобы получить информацию вы затем запустить его в вашем коде:

WinNT.OSVERSIONINFOEX osVersionInfo = new WinNT.OSVERSIONINFOEX(); 

if (!NativeMethods.GetVersionInfo(osVersionInfo)) { 
    System.out.println("Info failed to load!"); 
}