Как получить доступ к вложенным свойствам и методам с поздней привязкой?

Я хочу знать, как правильно получить доступ к свойству или методу с поздней привязкой из Delphi, когда свойство для доступа вложено в другое свойство. Позволь мне объяснить.

Проверьте этот пример приложения, чтобы проверить, активен ли брандмауэр, 3 объявленные функции используют COM-объект HNetCfg.FwMgr и возвращают одно и то же значение.

{$APPTYPE CONSOLE}

uses
  Variants,
  ActiveX,
  Comobj,
  SysUtils;

//in this function i don't use any "helper" property to hold the temp value of the properties.
function FirewallIsActive1 : Boolean;
var
  Firewall : OleVariant;
begin
  Firewall := CreateOleObject('HNetCfg.FwMgr'); 
  Result   := Firewall.LocalPolicy.CurrentProfile.FirewallEnabled;
end;


//here i hold the value of the LocalPolicy property 
function FirewallIsActive2 : Boolean;
var
  Firewall : OleVariant;
  Policy   : OleVariant;
begin
  Firewall := CreateOleObject('HNetCfg.FwMgr');
  Policy   := Firewall.LocalPolicy;
  Result   := Policy.CurrentProfile.FirewallEnabled;
end;


//Here i use  a  "helper" variable for each property
function FirewallIsActive3 : Boolean;
var
  Firewall : OleVariant;
  Policy   : OleVariant;
  Profile  : OleVariant;
begin
  Firewall := CreateOleObject('HNetCfg.FwMgr');
  Policy   := Firewall.LocalPolicy;
  Profile  := Policy.CurrentProfile;
  Result   := Profile.FirewallEnabled;
end;


var
  i : Integer;
begin
 try
    CoInitialize(nil);
    try
      Writeln(BoolToStr(FirewallIsActive1,True));
      Writeln(BoolToStr(FirewallIsActive2,True));
      Writeln(BoolToStr(FirewallIsActive3,True));
      Readln;
    finally
      CoUninitialize;
    end;
 except
    on E:Exception do
    begin
        Writeln(E.Classname, ':', E.Message);
        Readln;
    end;
  end;
end.

Я задаю этот вопрос, потому что хочу знать, способен ли компилятор Delphi генерировать код для размещения олевариантов в любом случае из трех функций?


person Salvador    schedule 15.04.2011    source источник


Ответы (1)


Delphi не будет генерировать никаких дополнительных вариантов и, следовательно, не будет проблем с их освобождением. Delphi просто пройдет маршрут IDispatch, чтобы получить значения в FirewallIsActive1.

Если вам нужно только одно значение, я бы предпочел это. Если вам нужно несколько сведений о вложенном интерфейсе, я бы сохранил это во вспомогательном варианте.

person Matthias Alleweldt    schedule 15.04.2011