Einzelnen Beitrag anzeigen

Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#29

Re: Registry-Probleme unter Vista

  Alt 28. Mär 2008, 13:42
Und derjenige, der noch nie selbst Fehlerpfade ignoriert hat, der werfe den ersten Stein.
Ich erwarte heute keine Tiefflieger!

Also hier mein Senf:

1. @Popov. Dein Programm funktioniert bei mir! Es muss also woanders happern.
Wenn dein Programm Freeware ist, dann solltest du uns zumindest den Programm/Source-Link geben. Der eine oder
andere wird es sicher unter Vista testen. Ein Text "geht nicht unter Vista" genügt leider nicht.
Wenn du es alleine schaffen willst, dann ist Logging in eine Datei eine sehr gute Alternative.
Du könntest z.B. für die harten Fälle Eurekalog kaufen. Das kostet nicht die Welt (wie manch andere
hochgelobte Software hier) und kann dir sogar ne Email schicken, wenn bei jemandem etwas schiefgegangen ist
(wenn derjenige es will). Für einfaches Logging kannst du aber auch entweder etwas selbst machen,
oder du verwendest z.B. JwsclLogging.pas von http://blog.delphi-jedi.net/security-library


2. @all: Wenn Popop sich kein Vista kaufen will, dann muss das doch als Antwort genügen. Aber
einfach festzulegen, dass man es haben MUSS, wenn man ein Programm nur leicht dafür anpassen will,
ist für mich unverständlich. Unverständlich daher, weil es bereits viele solcher Fragen hier gab und keiner sich darüber aufgeregt hat.
Das was man ihm vorwerfen kann ist schon in Punkt 1 abgehakt.

3. Ich erwarte keine steinige Luft. Rückggabewerte werden eben gerne ignoriert und Eingabewerte
werden überhaupt nicht oder nicht vollständig überprüft.
Wäre das nicht so, könnte man heute nicht mehr in Softwaresysteme einbrechen (Buffer overflow).

4.
Zitat:
Ich muss zustimmen. Popov, deine tolle, 6 Jahre alte Unit ist offenbar nicht in der Lage, ihre eigenen Funktionen auf Fehlerfälle zu überprüfen.
Meinst du die EasyRegAppexe.pas ?
Normal ist es doch andersherum, oder? Der Benutzer einer Unit/Bibliothek muss die Fehlerfälle überprüfen, die in einer Lib-Funktion auftreten.
Es gibt nur selten Fehler, die abgefangen werden können und damit es erlauben, die Funktion fortsetzen zu lassen. Eine Lib-Funktion kann nicht für
meine Idee (was ich damit vorhabe) die Fehler abfangen. Exceptions sind extra so entworfen worden, damit sie an den nächsten Aufrufer zurückgegeben werden
können. Meine ganze Bibliothek JWSCL steht (und fällt) mit diesem Prinzip. Nur die allerwenigsten Funktionen haben wirklich einen Rückggabewert.
Ich gehe sogar noch weiter und werfe eine bestimmte Exception immer dann, wenn eine Windows Funktion fehlschlägt. Da ich nicht für alle GetLastError Meldungen
eine Exception designen kann, gebe ich eben noch die Fehlernummer an. Borland/CG macht es mit EOleSysError genauso (wobei ich das misslungen finde,
da ich keine positiven Werte abfangen kann: S_FALSE *argh*).

5.Stichwort: Fehlerbehandlung und beschreibung. Ich kenne keine Anwendung, die das vollständig durchzieht. Würde man das machen, und es trete
ein Fehler auf, dann müsste man nicht nur in verständlichen Worten den Fehler beschreiben, sondern auch noch eine Lösung dem Benutzer präsentieren.
Schaut euch mal die unter Windows möglichen Fehlercodes an. Ich habe sie hier alle aufgelistet: http://blog.delphi-jedi.net/2008/03/...ut-no-warranty
Ich bezweifle schon, dass man ansatzweise dieses Problem lösen könnte.
Man sollte nur die bekannten Exceptions/Fehler abfangen und behandeln. Den Rest kann man abfließen und damit das Programm abstürzen lassen. Hu? Absturz?
Schlimme Sache!? Schlimmer wäre es, wenn das Programm nach einem abgefangenen aber unbekannten Fehler einfach weiterläuft und mir meine Daten durcheinander bringt.
Da ich alle paar Minuten speichere, ist das Ungespeicherte verschmerzbar. BlueScreens unter Windows funktionieren nach diesem Prinzip. Würde
ein Amok-Treiber weiterlaufen könnte das höchstwahrscheinlich mehr Schaden anrichten als ein paar verlorene Daten. Es gibt natürlich die rühmliche Ausnahme,
wo Menschenleben auf dem Spiel steht (Raumschiff, Lebenserhaltung, ...). Aber die wird nicht mit Delphi programmiert (Stichwort: ADA)

6. "Exception swallowing". Ich muss zugeben, dass hab ich bis jetzt noch nie gehört. Aber schon der Laut hört sich nicht gut an
Wäre google das Internet, dann müsste ich nun sagen, dass die Wortkombination nicht sehr bekannt ist. Trotzdem habe ich eine nette Abhandlung des Themas gefunden.
http://pragmati.st/2006/11/22/how-to-abuse-exceptions
Leider ist es nicht Delphi (mir egal), aber man kann trotzdem etwas lernen. Wer seine englisch Kenntnisse noch ausweiten möchte, der sollte dann das
im Blog anfangs erwähnte PDF lesen.

7.
Code:
if Registry.OpenKey(...) then
begin
  ...;
  ...;
end
else
  ...
Ich mag persönlich solchen Code überhaupt nicht. Man muss schon sehr schreibwütig sein, um soetwas auszuschreiben. Und wenn dann noch
der eXtended Syntax $X aktiv ist, dann meckert nichtmal der Compiler über ignorierte Rückgabewerte. Deshalb nehme ich gerne Exceptions,
da hier im Fehlerfall der Programmcode mir auf den Zehen landet.

Es gibt einen ähnlichen Fall in TRegistry, der mich sehr verwundert hat, als ich mir den TRegistry Code angeschaut habe:
Code:
if Registry.CreateKey(...) then
begin
  ...;
  ...;
end
else
  ...
Der Code ist nach dem CreateKey-Design einfach falsch. Die Delphi-Hilfe sagt dazu folgendes:

CreateKey gibt true zurück, wenn die Erzeugung erfolgreich ist. Im Fehlerfall wird eine Exception ausgelöst. Der Versuch, einen bereits vorhandenen Schlüssel erneut zu erzeugen, hat keine Auswirkung.

D.h. wenn ein Fehler auftaucht, dann ist der Rückgabewert zwar FALSE, jedoch wird der Else-Zweig garnicht erreicht, da schon eine Exception erzeugt wird.
Ich frage mich wirklich, wer auf diese Schnapssidee gekommen ist, eine Funktion den Fehlerwert per Rückgabewert UND Exception zu übermitteln.
Da denkt man einmal an alles, nur nicht die Hilfe zu lesen.

Code:
try
  Registry.CreateKey(...)
except
  on E : ERegistryException do
    ....
end;
Im Gegensatz dazu wirft TRegistry.OpenKey keine Exception.


8. Ich hatte mal eine Frage in einer Newsgroup von einem großen Konzern gestellt. Diese Frage war jedoch bereits auf ähnliche Art und Weise
in einer anderen Newsgroup derselben Firma gestellt worden. Ich wurde freundlich darauf hingewiesen. Jemand hatte diese Frage bereits gestellt,
und genau dieser Jemand hatte mir auch geantwortet. Die Antwort bestand aus drei Worten (übersetzt): "merkwürdige Frage! Nein?"
Meine Antwort darauf, dass er doch dieselbe Frage, aber woanders gestellt hätte und was denn daran so merkwürdig wäre, hat er dann so quittiert :
"Das ist keine gewöhnliche Frage...". Verstanden? Nein? Ich auch nicht.
Was ich damit meine ist, dass man sich im Internet nichts zu Herzen gehen lassen sollte. Nicht aufregen, und die Zeit stattdessen für bessere Dinge verwenden.
(Z.b. Software verbessern oder http://blog.delphi-jedi.net besuchen)
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat