AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Aufruf von Properties über Automatisierung schlägt fehl?
Thema durchsuchen
Ansicht
Themen-Optionen

Aufruf von Properties über Automatisierung schlägt fehl?

Ein Thema von Whookie · begonnen am 19. Mai 2015 · letzter Beitrag vom 28. Mai 2015
Antwort Antwort
Whookie

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

Aufruf von Properties über Automatisierung schlägt fehl?

  Alt 19. Mai 2015, 15: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
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.680 Beiträge
 
Delphi 5 Professional
 
#2

AW: Aufruf von Properties über Automatisierung schlägt fehl?

  Alt 19. Mai 2015, 16:33
Schau mal auf dieser Seite vorbei, vor allem der vorletzte Abschnitt "Retrieving Firewall Settings".

MfG Dalai
  Mit Zitat antworten Zitat
Whookie

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

AW: Aufruf von Properties über Automatisierung schlägt fehl?

  Alt 20. Mai 2015, 07:31
Ja, diese Seite habe ich auch gefunden und das Anhängen einer Rule funktioniert auch, weil es über "RulesObject.Add(NewRule);" geht und das "zufällig" ein Methodenaufruf ist.

Wenn du da aber Check if Rule is Enabled ausprobierst (oder einfach:

    Res := FW.IsRuleGroupCurrentlyEnabled('File and Printer Sharing'); in meiner Demo aufrufst geht das auch nicht.

Aus dem Beispiel entnehme ich aber das das irgendwann mal funktioniert hat? Kann das jemand bestätigen (mit XE7+XE8 jedenfalls nichts zu machen).
Whookie

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

Registriert seit: 9. Apr 2006
1.680 Beiträge
 
Delphi 5 Professional
 
#4

AW: Aufruf von Properties über Automatisierung schlägt fehl?

  Alt 20. Mai 2015, 12:40
Ich hab eben mal das Beispiel "Retrieving Firewall Settings" ausprobiert und das tut, was es soll. Ich bekomme die Ausgabe "Firewall is ON on private profile.".

Das Beispiel "Checking if a Rule is Enabled" funktioniert nicht, da bekomme ich ebenfalls die Meldung "Mitglied nicht gefunden". Lustig, denn wenn ich auf einer PowerShell die Member ausgeben lasse mit
Code:
$fw = New-Object -ComObject hnetcfg.fwpolicy2
$fw | Get-Member
bekomme ich dies:
Code:
Name                                        MemberType           Definition
----                                         ----------            ----------
EnableRuleGroup                             Method               void EnableRuleGroup (int, string, bool)
IsRuleGroupEnabled                          Method               bool IsRuleGroupEnabled (int, string)
RestoreLocalFirewallDefaults                Method               void RestoreLocalFirewallDefaults ()
BlockAllInboundTraffic                      ParameterizedProperty bool BlockAllInboundTraffic (NET_FW_PROFILE_TYPE2_) {get} {set}
DefaultInboundAction                        ParameterizedProperty NET_FW_ACTION_ DefaultInboundAction (NET_FW_PROFILE_TYPE2_) {get} {set}
DefaultOutboundAction                       ParameterizedProperty NET_FW_ACTION_ DefaultOutboundAction (NET_FW_PROFILE_TYPE2_) {get} {s...
ExcludedInterfaces                          ParameterizedProperty Variant ExcludedInterfaces (NET_FW_PROFILE_TYPE2_) {get} {set}
FirewallEnabled                             ParameterizedProperty bool FirewallEnabled (NET_FW_PROFILE_TYPE2_) {get} {set}
IsRuleGroupCurrentlyEnabled                 ParameterizedProperty bool IsRuleGroupCurrentlyEnabled (string) {get}
NotificationsDisabled                       ParameterizedProperty bool NotificationsDisabled (NET_FW_PROFILE_TYPE2_) {get} {set}
UnicastResponsesToMulticastBroadcastDisabled ParameterizedProperty bool UnicastResponsesToMulticastBroadcastDisabled (NET_FW_PROFILE_TYP...
CurrentProfileTypes                         Property             int CurrentProfileTypes () {get}
LocalPolicyModifyState                      Property             NET_FW_MODIFY_STATE_ LocalPolicyModifyState () {get}
Rules                                       Property             INetFwRules Rules () {get}
ServiceRestriction                          Property             INetFwServiceRestriction ServiceRestriction () {get}
In der Ausgabe ist aber der Grund zu finden: Es ist ein Property, keine Funktion! Daraus folgt, dass man den Code so ändern muss:
bIsEnabled := fwPolicy2.IsRuleGroupCurrentlyEnabled['File and Printer Sharing']; und das funktioniert auch. Aber es kann sein, dass der String noch sprachspezifisch ist, d.h. er müsste ggf. für ein deutsches System übersetzt werden.

MfG Dalai
  Mit Zitat antworten Zitat
Whookie

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

AW: Aufruf von Properties über Automatisierung schlägt fehl?

  Alt 28. Mai 2015, 08:27
Ist ein Bug und mal offiziell intern bei Emba übernommen
Whookie

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


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:16 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz