Ich bin auf folgendes Phänomen gestoßen:
Delphi-Quellcode:
program Project1;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils, Variants,
ActiveX, ComObj;
Var
FW: Variant;
Res: Boolean;
begin
try
CoInitialize(
nil);
FW := CreateOleObject('
HNetCfg.FwPolicy2');
Res := FW.FirewallEnabled(1);
WriteLn('
Domain.FW.Enabled = ',BoolToStr(Res, True));
ReadLn;
FW := Unassigned;
except
on E:
Exception do
Writeln(E.ClassName, '
: ', E.
Message);
end;
end.
Eigentlich sollte das kleine Programm ausgeben ob die Firewall ein/aus ist (unter Windows 7). Aber ich bekomme die Meldung: "....EOleSysError mit der Meldung 'Mitglied nicht gefunden' aufgetreten."
Gebe ich alle Member von FW aus gibts aber (unter anderem) folgende Einträge:
0.8:
get property FirewallEnabled (profileType: NET_FW_PROFILE_TYPE2_) : Boolean;
0.9:
put property FirewallEnabled (profileType: NET_FW_PROFILE_TYPE2_; riid: Boolean);
Also reingedebuggt und ich lande gleich mal in _DispInvoke() in System.Variants und da ist auch schon der Fehler ersichtlich...
Der Parameter "CallDesc" enthält als "CallType" eine 1 (= DISPATCH_METHOD) statt einer 2 (= DISPATCH_PROPERTYGET). Ändert man das dort geht der Aufruf auch wie erwartet durch.
Daher die Frage: Gibts eine spezielle Aufrufkonvention oder eine andere Methode wie ich meinem Aufruf den korrekten Typ mitgeben kann (sollte das nicht Anhand des Namens und der Signatur selbst erkannt werden?)?