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.

この質問をするのは、3 つの関数のいずれの場合でも、Delphi コンパイラがオレバリアントを破棄するコードを生成できるかどうかを知りたいからです。

4

1 に答える 1

6

Delphi は追加のバリアントを生成しないため、それらを解放するのに問題はありません。Delphi は IDispatch ルートをトラバースして、値を取得しFirewallIsActive1ます。

必要な値が 1 つだけの場合は、これをお勧めします。ネストされたインターフェイスの情報がいくつか必要な場合は、これをヘルパー バリアントに保存します。

于 2011-04-15T20:51:45.123 に答える