【问题标题】:How to use kernel32.dll in Java如何在 Java 中使用 kernel32.dll
【发布时间】:2017-01-29 17:51:56
【问题描述】:

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

【问题讨论】:

  • 您需要JNI JNA之一。
  • 谢谢我想通了。我很快就会回答我自己的问题。

标签: java kernel32


【解决方案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!");
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 2012-01-03
    • 1970-01-01
    • 2015-04-12
    • 1970-01-01
    相关资源
    最近更新 更多