gpt4 book ai didi

com - 迭代 SWbemPropertySet 对象

转载 作者:行者123 更新时间:2023-12-02 11:50:17 25 4
gpt4 key购买 nike

使用 COM API 的 WMI 中的 WQL 查询返回 SWbemObjectSet。由此,我们可以使用ItemIndex方法迭代集合中的所有对象,从而产生许多 SWbemObject s。它们有一个 Properties_ 属性,它返回 SWbemPropertySet .

该对象有一个 Count 属性,但没有 ItemIndex 方法,而只有一个 Item 方法,该方法采用属性的字符串名称获取。我想迭代所有可用的属性,因此我没有可用的名称。我尝试调用 ItemIndex 方法,但是(根据文档)该对象上不存在该方法。有许多 VBScript 文档都执行类似 For Each prop in object.Properties_ 的操作,因此我认为这在某种程度上是可能的。

如何找到所有属性?

最佳答案

首先,ItemIndex 属性仅存在于 Microsoft WMI 脚本库 的某些版本中,您可以在我之前写的这篇文章中找到有关此主题的更多信息
Be careful when you import the Microsoft WMI Scripting Library
(该代码使用 Delphi,但同样适用于使用该库的任何语言)。

现在迭代 SWbemPropertySet 的元素您必须获取访问 _NewEnum 属性的枚举器实例,该属性提供了使用 IEnumVARIANT 枚举变体集合的方法。界面。这是由 vbscript 自动完成的,但在其他语言(如 Delphi 或 C++)中必须手动完成。

尝试这个 Delphi 示例

{$APPTYPE CONSOLE}    

uses
SysUtils,
ActiveX,
ComObj,
Variants,
WbemScripting_TLB in 'WbemScripting_TLB.pas';

procedure ShowProperties(const WMINameSpace, WMIClass : string);
var
WMIServices : ISWbemServices;
SWbemObjectSet : ISWbemObjectSet;
SObject : ISWbemObject;
LProperty : ISWbemProperty;
Enum, Enum2 : IEnumVariant;
TempObj, TempObj2: OleVariant;
Value : Cardinal;
SWbemPropertySet: ISWbemPropertySet;
begin
WMIServices := CoSWbemLocator.Create.ConnectServer('.', WMINameSpace,'', '', '', '', 0, nil);
SWbemObjectSet := WMIServices.ExecQuery(Format('Select * FROM %s',[WMIClass]), 'WQL', 0, nil);
Enum := (SWbemObjectSet._NewEnum) as IEnumVariant;
if (Enum.Next(1, TempObj, Value) = S_OK) then
begin
SObject := IUnknown(TempObj) as ISWBemObject;
SWbemPropertySet := SObject.Properties_;
Enum2 := (SWbemPropertySet._NewEnum) as IEnumVariant;
while (Enum2.Next(1, TempObj2, Value) = S_OK) do
begin
LProperty := IUnknown(TempObj2) as ISWbemProperty;
Writeln(LProperty.Name);
TempObj2:=Unassigned;
end;
TempObj:=Unassigned;
end;
end;

begin
try
CoInitialize(nil);
try
ShowProperties('root\cimv2','Win32_BaseBoard');
finally
CoUninitialize;
end;
except
on E:EOleException do
Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode]));
on E:Exception do
Writeln(E.Classname, ':', E.Message);
end;
Writeln('Press Enter to exit');
Readln;
end.

希望您能将此示例翻译成 Go 语言。

关于com - 迭代 SWbemPropertySet 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20386875/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com