Einzelnen Beitrag anzeigen

Whookie

Registriert seit: 3. Mai 2006
Ort: Graz
445 Beiträge
 
Delphi 10.3 Rio
 
#1

Aufruf von Properties über Automatisierung schlägt fehl?

  Alt 19. Mai 2015, 16:44
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?)?
Whookie

Software isn't released ... it is allowed to escape!
  Mit Zitat antworten Zitat