2

我想知道当要访问的属性嵌套在另一个属性中时,从 Delphi 访问后期绑定属性或方法的正确方法是什么。让我解释。

检查此示例应用程序以检查防火墙是否处于活动状态,声明的 3 个函数使用HNetCfg.FwMgrCOM 对象并返回相同的值。

{$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 编译器是否能够生成代码以在 3 个函数的任何情况下处理 olevariants?

4

1 回答 1

6

Delphi 不会生成任何额外的变体,因此释放它们不会有任何问题。Delphi 只会遍历 IDispatch 路径来获取FirewallIsActive1.

如果您只需要一个值,我会更喜欢这个。如果您需要嵌套接口的多个信息,我会将其存储在辅助变体中。

于 2011-04-15T20:51:45.123 回答