题
我正在使用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”子句中处理它失败的情况。)
但是否则......我认为它不会比你已经短得多。
不隶属于 StackOverflow