Inno Setup: унаследованные свойства OLE-объекта недоступны? - PullRequest
1 голос
/ 29 мая 2019

Я следовал за этим принятым вопросом на запрос сетевых адаптеров компьютеров.Наконец-то это сработало, но я все еще сталкиваюсь с проблемой чтения значений этих свойств:

  • Win32_NetworkAdapterConfiguration.Caption
  • Win32_NetworkAdapterConfiguration.Description

Каждый раз, когда коддостигает этой строки, где networkAdapter.Caption вызывается, возникает ошибка времени выполнения, говорящая:

Ошибка времени выполнения (при 60: 8952): неизвестный метод.

Это мой код, принятый из вышеупомянутого вопроса переполнения стека:

Log('Querying WMI for network adapter data...');
query := 'SELECT IPEnabled, IPAddress, MACAddress, InterfaceIndex FROM Win32_NetworkAdapterConfiguration';
networkAdapters := wbemServices.ExecQuery(query);
if not VarIsNull(networkAdapters) then
begin
  for i := 0 to networkAdapters.Count - 1 do
  begin
    networkAdapter := networkAdapters.ItemIndex(i);

    if (not VarIsNull(networkAdapter.MACAddress)) and networkAdapter.IPEnabled and (not VarIsNull(networkAdapter.IPAddress)) then
    begin
      SetArrayLength(sysInfo.networkAdapters, GetArrayLength(sysInfo.networkAdapters) + 1);

      nicRec := sysInfo.networkAdapters[adapterIndex];

      { Adapter name }
      nicRec.name := defaultIfNull(networkAdapter.Caption, Format('Adapter %d', [i]));
      Log(Format('    NIC[%d] name........: %s', [adapterIndex, nicRec.name]));
      { Adapter index }
      nicRec.index := defaultIfNull(networkAdapter.InterfaceIndex, adapterIndex);
      Log(Format('    NIC[%d] index.......: %d', [adapterIndex, nicRec.index]));
      { Adapter MAC address }
      nicRec.macAddress := defaultIfNull(networkAdapter.MACAddress, '');
      Log(Format('    NIC[%d] MAC address.: %s', [adapterIndex, nicRec.macAddress]));
      { Adapter ip address(es) }
      nicRec.ipAddresses := TStringList.Create;
      if not VarIsNull(networkAdapter.IPAddress) then
      begin
        ips := networkAdapter.IPAddress;
        for j := 0 to GetArrayLength(ips) - 1 do
        begin
          nicRec.ipAddresses.Add(ips[j]);
          Log(Format('    NIC[%d] IPv4 address: %s', [adapterIndex, nicRec.ipAddresses.Strings[j]]));          
        end;
      end;

      adapterIndex := adapterIndex + 1;
    end;
  end;
end;

После прочтения в документах Microsoft я наткнулся на описание этих свойств.В нем говорится, что класс Win32_NetworkAdapterConfiguration расширяет класс CIM_Setting.Свойства Caption и Description определены там.Это проблема с компилятором Inno Setup (я использую последнюю версию 6.0.2), или мне нужно применить какое-либо приведение к переменной варианта may?

1 Ответ

1 голос
/ 29 мая 2019

Конечно, унаследованные свойства доступны. На самом деле Inno Setup даже не волнует, что это за класс. Используется поздняя привязка . Разрешение имени свойства делегировано самому классу.

Но вы не работаете с Win32_NetworkAdapterConfiguration. IWbemServices.ExecQuery возвращает IEnumWbemClassObject, что в свою очередь перечисляет IWbemClassObject. И это содержит результаты вашего запроса . Ваш запрос не запрашивает свойства Caption и Description, поэтому набор результатов, естественно, не содержит их.

Добавьте свойства к запросу:

Query := 'SELECT IPEnabled, IPAddress, MACAddress, InterfaceIndex, Caption, Description FROM Win32_NetworkAdapterConfiguration';
...