Java 使用Jacob和WMI编写更好的代码

Java 使用Jacob和WMI编写更好的代码,java,wmi,jacob,Java,Wmi,Jacob,我正在使用JACOB通过WMI访问系统信息。我还没有在网上找到很多关于WMI和Jacob的文档,我想知道我是否可以得到一些帮助来提高代码的效率 代码如下: 正如你所看到的,仅仅为一个项目在集合中循环似乎没有多大意义。我只想查询查询语句中的一列,并以尽可能少的开销尽可能快速高效地从中获得结果 是否有人对JACOB有丰富的经验,并能以最好的方式获取这些价值观 谢谢 Steve我的理解是,一般来说,WMI将始终为任何ExecQuery返回零个或多个项的集合。如果JACOB的EnumVariant类是

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

代码如下:

正如你所看到的,仅仅为一个项目在集合中循环似乎没有多大意义。我只想查询查询语句中的一列,并以尽可能少的开销尽可能快速高效地从中获得结果

是否有人对JACOB有丰富的经验,并能以最好的方式获取这些价值观

谢谢


Steve

我的理解是,一般来说,WMI将始终为任何ExecQuery返回零个或多个项的集合。如果JACOB的EnumVariant类是从WMI接收信息的最佳方式(来自我看到的示例),那么您需要以某种方式枚举它

(您可能可以将更多的行压缩在一起,例如
EnumVariant EnumVariant=new EnumVariant(mactivexxwmi.invoke(“ExecQuery”,new Variant(query)).toDispatch();
——但这会使它更难阅读,对性能或其他方面没有帮助。)

如果您确定查询只返回一个项目(如示例中所示),则可以将“while”语句更改为“If”(然后在“else”子句中处理失败的情况)


但除此之外。。。我不认为它会比你已经拥有的短得多。

仔细看后,你似乎是对的。我将等待,看看是否有其他人知道什么不同,但现在我正在接受你的建议与代码。
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());
}