Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Aufruf von Properties über Automatisierung schlägt fehl? (https://www.delphipraxis.net/185156-aufruf-von-properties-ueber-automatisierung-schlaegt-fehl.html)

Whookie 19. Mai 2015 15:44

Aufruf von Properties über Automatisierung schlägt fehl?
 
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?)?

Dalai 19. Mai 2015 16:33

AW: Aufruf von Properties über Automatisierung schlägt fehl?
 
Schau mal auf dieser Seite vorbei, vor allem der vorletzte Abschnitt "Retrieving Firewall Settings".

MfG Dalai

Whookie 20. Mai 2015 07:31

AW: Aufruf von Properties über Automatisierung schlägt fehl?
 
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:

Delphi-Quellcode:
    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).

Dalai 20. Mai 2015 12:40

AW: Aufruf von Properties über Automatisierung schlägt fehl?
 
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:
Delphi-Quellcode:
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

Whookie 28. Mai 2015 08:27

AW: Aufruf von Properties über Automatisierung schlägt fehl?
 
Ist ein Bug und mal offiziell intern bei Emba übernommen


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:24 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