问题描述
|
我想知道当要访问的属性嵌套在另一个属性中时,从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编译器是否能够生成在3种函数的任何情况下都可以处理油变量的代码?
解决方法
Delphi将不会生成任何其他变体,因此释放它们不会有任何问题。 Delphi将仅遍历IDispatch路线以获得
FirewallIsActive1
中的值。
如果您只需要一个值,我会更喜欢这个。如果您需要嵌套接口的多个信息,则可以将其存储在helper变量中。