如何在Java中使用kernel32.dll

时间:2017-01-29 17:51:57

标签: java kernel32

我正在尝试从Windows安装中获取一些信息。 我能够使用C#中的下面的代码轻松完成此操作,但我正在寻找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);

1 个答案:

答案 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!");
}