2017-04-05 143 views
2

從Inno Setup安裝程序中獲取Windows XP中的MAC地址列表時出現問題。在Windows XP和Inno Setup中迭代SWbemObjectSet

我嘗試寫一些代碼(把它從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上做到這一點?我真的不知道,因爲我在互聯網上找到的每個解決方案都行不通。可能是因爲Inno Setup的庫有沒有這樣的類型IEnumVariant,我不能SWbemObjectSetfor each obj in objset語法遍歷...

我也試圖讓SWbemObjectItem方法:

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

但它返回錯誤

SWbemObjectSet:找不到

任何人都可以幫助我嗎?這個問題有一些解決辦法嗎

回答

1

是的,你將不得不實施IEnumVariant。不知道這是可能的Pascal腳本。


使用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?

+0

雖然,現在我看你嘗試'.Item()' - 它是可以在XP?如果是這樣,比這是正確的語法:'WbemObjectSet.Item('Win32_NetworkAdapterConfiguration ='+ IntToStr(I));' –

+0

'WbemObjectSet.Item('Win32_NetworkAdapterConfiguration ='+ IntToStr(I));'不起作用...它使文本上升到MsgBox:SWbemObjectSet:未找到 –

+0

確保刪除了'IPEnabled = true'過濾器,只有'I'與'Index'匹配的方式 - 請參閱我編輯的答案。 –