2017-04-05 1 views
2

Ich habe ein Problem mit MAC-Adressen Liste in Windows XP von Inno Setup Installer.Iterate SWbemObjectSet in Windows XP und Inno Setup

Ich versuche, einige Code zu schreiben (nahm es von 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; 

Und ich habe ein Problem mit ItemIndex Methode. Es erscheint nur in Windows Vista. Wie kann ich das unter XP machen? Ich weiß es wirklich nicht, denn jede Lösung, die ich im Internet gefunden habe, funktioniert nicht. sein kann, weil in Inno Setup-Bibliotheken gibt es keine solche Art wie IEnumVariant ist und ich von SWbemObjectSet mit for each obj in objset Syntax nicht laufen kann ...

ich auch SWbemObject mit Item Methode zu bekommen versuchte:

WbemObject := WbemObjectSet.Item('Win32_NetworkAdapterConfiguration.Index=' + IntToStr(I)); 

aber es gibt Fehler

SWbemObjectSet: nicht gefunden

Kann mir jemand helfen? Hat dieses Problem eine Lösung?

Antwort

1

Ja, Sie müssten die IEnumVariant implementieren. Nicht sicher, ob das mit Pascal Script möglich ist.


Verwendung des SWbemObjectSet.Item method ist wie folgt:

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; 

Aber es scheint, dass weder dieser Ansatz unter Windows XP funktioniert.


Eine mögliche Abhilfe ist

wmic nicconfig get MACAddress 

in eine Datei umleiten auszuführen und es lesen.

How to get an output of an Exec'ed program in Inno Setup? Siehe

+0

Obwohl, jetzt habe ich Ihren Versuch mit '.Item()' sehen - ist es auf XP zur Verfügung? Wenn dies der Fall ist, ist dies die korrekte Syntax: 'WbemObjectSet.Item ('Win32_NetworkAdapterConfiguration =' + IntToStr (I));' –

+0

'WbemObjectSet.Item ('Win32_NetworkAdapterConfiguration =' + IntToStr (I));' funktioniert nicht ... Es steigt MsgBox mit Text: SWbemObjectSet: Nicht gefunden –

+0

Stellen Sie sicher, dass Sie den 'IPEnabled = true' Filter entfernen, nur so wird das' I' mit 'Index' übereinstimmen - siehe meine bearbeitete Antwort. –