我正在使用JACOB通过WMI访问系统信息。我没有在网上找到很多关于WMI和Jacob的文档,并且想知道我是否可以帮助我们提高代码的效率。

这是代码:     

ActiveXComponent mActiveXWMI = new ActiveXComponent("winmgmts:\\\\localhost\\root\\CIMV2");
String query = "SELECT * FROM Win32_PerfFormattedData_PerfOS_Processor WHERE Name='_Total'";
Variant vCollection = mActiveXWMI.invoke("ExecQuery", new Variant(query));

EnumVariant enumVariant = new EnumVariant(vCollection.toDispatch());
Dispatch item = null;
while (enumVariant.hasMoreElements()) {
    item = enumVariant.nextElement().toDispatch();
    cpuUsage = Double.parseDouble(Dispatch.call(item, "PercentProcessorTime").toString());
}

正如人们所看到的,对于仅仅一个项目来说,通过集合循环似乎没有多大意义。我想查询查询语句中的一列,并尽可能快速有效地从中获取结果,并尽可能减少开销。

有没有人对JACOB有很多经验并以最佳方式检索这些值?

谢谢,

史蒂夫

有帮助吗?

解决方案

我的理解是,通常,WMI将始终为任何ExecQuery返回零个或多个项的集合。如果JACOB的EnumVariant类是从WMI接收信息的最佳方式(从我见过的例子中),那么你需要以这种或那种方式枚举它。

(您可能能够将更多行压缩在一起,例如 EnumVariant enumVariant = new EnumVariant(mActiveXWMI.invoke(" ExecQuery",new Variant(query))。toDispatch()); - 但这使得它更难以阅读,并且无助于表演或其他任何事情。)

如果您确定查询将返回不超过一个项目 - 如您的示例中所示 - 您可以更改“while”到“如果”声明(然后在你的“else”子句中处理它失败的情况。)

但是否则......我认为它不会比你已经短得多。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top