Как получить доступ к вложенным свойствам и методам с поздней привязкой? - PullRequest
2 голосов
/ 16 апреля 2011

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

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

{$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 сгенерировать код для удаления olevariants в любом случае из 3 функций?

1 Ответ

6 голосов
/ 16 апреля 2011

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

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

...