如何在 Java 中使用 kernel32.dll

How to use kernel32.dll in Java

我正在尝试从 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);

经过一番研究,这里是如何完成任务的。你必须使用 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!");
}