在 Windows XP 和 Inno Setup 中迭代 SWbemObjectSet
Iterate SWbemObjectSet in Windows XP and Inno Setup
我在从 Inno Setup 安装程序获取 Windows XP 中的 MAC- 地址列表时遇到问题。
我正在尝试编写一些代码(从 Get MAC address in Inno Setup 获取):
function GetMacAddressesList(out List: Array of String): Integer;
var
I: Integer;
WQLQuery: string;
WbemLocator: Variant;
WbemServices: Variant;
WbemObject: Variant;
WbemObjectSet: Variant;
begin
Result := 0;
WbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
WbemServices := WbemLocator.ConnectServer('localhost', 'root\cimv2');
WQLQuery := 'Select * from Win32_NetworkAdapterConfiguration where IPEnabled=true';
WbemObjectSet := WbemServices.ExecQuery(WQLQuery);
if not VarIsNull(WbemObjectSet) and (WbemObjectSet.Count > 0) then
begin
Result := WbemObjectSet.Count;
SetArrayLength(List, WbemObjectSet.Count);
for I := 0 to WbemObjectSet.Count - 1 do
begin
WbemObject := WbemObjectSet.ItemIndex(I);
if not VarIsNull(WbemObject) then
begin
List[I] := WbemObject.MACAddress;
StringChange(List[i], ':', '');
StringChange(List[I], '-', '');
end;
end;
end;
end;
我对 ItemIndex
方法有疑问。它仅出现在 Windows Vista 中。我怎样才能在 XP 上执行此操作?我真的不知道,因为我在 Internet 上找到的所有解决方案都行不通。可能是因为在 Inno Setup 库中没有 IEnumVariant
这样的类型,我不能用 for each obj in objset
语法迭代 SWbemObjectSet
...
我也试图用 Item
方法获得 SWbemObject
:
WbemObject := WbemObjectSet.Item('Win32_NetworkAdapterConfiguration.Index=' + IntToStr(I));
但是 returns 错误
SWbemObjectSet: not found
有人可以帮助我吗?这个问题有解决办法吗?
是的,您必须实施 IEnumVariant
。不确定 Pascal Script 是否可行。
SWbemObjectSet.Item
method的用法是这样的:
WbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
WbemServices := WbemLocator.ConnectServer('localhost', 'root\cimv2');
WQLQuery := 'Select * from Win32_NetworkAdapterConfiguration';
WbemObjectSet := WbemServices.ExecQuery(WQLQuery);
if not VarIsNull(WbemObjectSet) then
begin
for I := 0 to WbemObjectSet.Count - 1 do
begin
WbemObject :=
WbemObjectSet.Item(Format('Win32_NetworkAdapterConfiguration=%d', [I]));
if WbemObject.IPEnabled then
begin
Log(WbemObject.MACAddress);
end;
end;
end;
但似乎这两种方法都不适用于 Windows XP。
一个可能的解决方法是执行
wmic nicconfig get MACAddress
重定向到一个文件并阅读它。
见How to get an output of an Exec'ed program in Inno Setup?
我在从 Inno Setup 安装程序获取 Windows XP 中的 MAC- 地址列表时遇到问题。
我正在尝试编写一些代码(从 Get MAC address in Inno Setup 获取):
function GetMacAddressesList(out List: Array of String): Integer;
var
I: Integer;
WQLQuery: string;
WbemLocator: Variant;
WbemServices: Variant;
WbemObject: Variant;
WbemObjectSet: Variant;
begin
Result := 0;
WbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
WbemServices := WbemLocator.ConnectServer('localhost', 'root\cimv2');
WQLQuery := 'Select * from Win32_NetworkAdapterConfiguration where IPEnabled=true';
WbemObjectSet := WbemServices.ExecQuery(WQLQuery);
if not VarIsNull(WbemObjectSet) and (WbemObjectSet.Count > 0) then
begin
Result := WbemObjectSet.Count;
SetArrayLength(List, WbemObjectSet.Count);
for I := 0 to WbemObjectSet.Count - 1 do
begin
WbemObject := WbemObjectSet.ItemIndex(I);
if not VarIsNull(WbemObject) then
begin
List[I] := WbemObject.MACAddress;
StringChange(List[i], ':', '');
StringChange(List[I], '-', '');
end;
end;
end;
end;
我对 ItemIndex
方法有疑问。它仅出现在 Windows Vista 中。我怎样才能在 XP 上执行此操作?我真的不知道,因为我在 Internet 上找到的所有解决方案都行不通。可能是因为在 Inno Setup 库中没有 IEnumVariant
这样的类型,我不能用 for each obj in objset
语法迭代 SWbemObjectSet
...
我也试图用 Item
方法获得 SWbemObject
:
WbemObject := WbemObjectSet.Item('Win32_NetworkAdapterConfiguration.Index=' + IntToStr(I));
但是 returns 错误
SWbemObjectSet: not found
有人可以帮助我吗?这个问题有解决办法吗?
是的,您必须实施 IEnumVariant
。不确定 Pascal Script 是否可行。
SWbemObjectSet.Item
method的用法是这样的:
WbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
WbemServices := WbemLocator.ConnectServer('localhost', 'root\cimv2');
WQLQuery := 'Select * from Win32_NetworkAdapterConfiguration';
WbemObjectSet := WbemServices.ExecQuery(WQLQuery);
if not VarIsNull(WbemObjectSet) then
begin
for I := 0 to WbemObjectSet.Count - 1 do
begin
WbemObject :=
WbemObjectSet.Item(Format('Win32_NetworkAdapterConfiguration=%d', [I]));
if WbemObject.IPEnabled then
begin
Log(WbemObject.MACAddress);
end;
end;
end;
但似乎这两种方法都不适用于 Windows XP。
一个可能的解决方法是执行
wmic nicconfig get MACAddress
重定向到一个文件并阅读它。
见How to get an output of an Exec'ed program in Inno Setup?