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?)? |
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 |
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:
in meiner Demo aufrufst geht das auch nicht.
Res := FW.IsRuleGroupCurrentlyEnabled('File and Printer Sharing');
Aus dem Beispiel entnehme ich aber das das irgendwann mal funktioniert hat? Kann das jemand bestätigen (mit XE7+XE8 jedenfalls nichts zu machen). |
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:
bekomme ich dies:
$fw = New-Object -ComObject hnetcfg.fwpolicy2
$fw | Get-Member
Code:
In der Ausgabe ist aber der Grund zu finden: Es ist ein Property, keine Funktion! Daraus folgt, dass man den Code so ändern muss:
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}
Delphi-Quellcode:
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.
bIsEnabled := fwPolicy2.IsRuleGroupCurrentlyEnabled['File and Printer Sharing'];
MfG Dalai |
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