Discussion:
check Summe ermitteln klappt nicht
(zu alt für eine Antwort)
Andreas Niggemann
2021-12-28 08:31:33 UTC
Permalink
In article <***@mid.individual.net>, ***@web.de
says...
leider stürtzt das Programm in der unten aufgeführten Funktion
Dort möchte ich gerne eine CheckSum anzeigen.
showmessage(
'size res: ' + IntToStr(fileSizeLow) + #13 +
'size arg: ' + IntToStr(fsizeHigh ) + #13#13 +
'checksum: ' + PChar(checksum^));
Versuchs mal mit:
'checksum:' + IntToStr(checksum^));
--
Andreas (http://www.lichtbildner.net)
Die FAQ zu d.r.f: http://faq.d-r-f.de
Porty für Arme: http://faq.d-r-f.de/wiki/Porty_f%C3%BCr_Arme
Toshiba Flashair: http://faq.d-r-f.de/wiki/FlashAir_Autodownloader
Holger Schieferdecker
2022-01-10 10:03:39 UTC
Permalink
Hallo,
leider stürtzt das Programm in der unten aufgeführten Funktion
Auf das Absturzproblem hast Du ja bereits eine Antwort erhalten.

Mich würde jetzt mal noch interessieren, was die Profis hier zur
Struktur der Funktion sagen. Mir sind da ein paar Dinge aufgefallen, die
ich persönlich zumindest anders machen würde. Aber ich lerne auch gerne
dazu.

Zunächst hätte ich das Aufräumen nicht mit einem Label gemacht, sondern
mit einem try...finally Block. Auch die Abfragen auf 0 oder nil hätte
ich anders herum gestellt. Und bei ExitProcess wird das Programm doch
hart abgebrochen, was Speicherlecks zur Folge haben kann, oder? Da
könnte man im Fehlerfall noch eine Fehlervariable zurückgeben, die im
Hauptprogramm ausgewertert wird und dort ggf. das Programm sauber
beenden. Oder man erzeugt eine eigene Exception, auf die dann außerhalb
der Funktion reagiert wird.

function ComputePEChecksum(FileName: string): DWORD;
begin
try
...
if (... <> 0) then
begin
//weitermachen

result:=...;
end;
finally
// aufräumen
end;
end;

Holger
Jens Kallup
2022-01-10 12:22:05 UTC
Permalink
Post by Holger Schieferdecker
Hallo,
Holger
Du meinst, dass finally am Programmende sowie beim
zurÃŒckgeben der "Result" aufgerufen wird?
Hmm, wenn ja, okay, kann man machen.

Jens
Holger Schieferdecker
2022-01-10 12:40:38 UTC
Permalink
Post by Jens Kallup
Post by Holger Schieferdecker
Hallo,
Holger
Du meinst, dass finally am Programmende sowie beim
zurückgeben der "Result" aufgerufen wird?
Hmm, wenn ja, okay, kann man machen.
Ich bin jetzt nicht ganz sicher, ob ich verstehe, was Deine Frage ist.
Der Teil nach finally wird ausgeführt, sobald alles nach try
abgearbeitet ist oder dort eine Exception auftritt.

try
// beliebiger Code
finally
// Aufräumarbeiten
end;

Das obige Konstrukt dient dazu, Objekte sicher wieder freizugeben, auch
wenn zwischendurch wegen eines Fehlers eine Exception ausgelöst wird.
Der Teil nach finally wird immer ausgeführt, an dieser Stelle. So ein
Konstrukt muß nicht eine ganze Funktion umfassen, sondern danach kann
weiterer Code folgen.

In Deinem Fall würde man z.B. die Freigabe des Handles nach finally
schreiben. Die erfolgt dann immer, auch wenn es vorher ein Problem gab.

Holger
Jens Kallup
2022-01-10 13:30:24 UTC
Permalink
In Deinem Fall wÃŒrde man z.B. die Freigabe des Handles nach finally
schreiben. Die erfolgt dann immer, auch wenn es vorher ein Problem gab.
Holger
ok, verstehe.

Holger Schieferdecker
2022-01-10 10:13:17 UTC
Permalink
Post by Andreas Niggemann
says...
leider stürtzt das Programm in der unten aufgeführten Funktion
Dort möchte ich gerne eine CheckSum anzeigen.
if (nth = nil) then
checksum := nil;
showmessage(
'size res: ' + IntToStr(fileSizeLow) + #13 +
'size arg: ' + IntToStr(fsizeHigh ) + #13#13 +
'checksum: ' + PChar(checksum^));
'checksum:' + IntToStr(checksum^));
Ich habe es jetzt nicht probiert, aber falls checksum=nil, dann knallt
das doch, oder? Die zwei Zeilen oberhalb aus der Funktion von Jens, wo
das ggf. so gesetzt wird, habe ich oben eingefügt. Sollte man also
behandeln oder umschreiben.

if (nth <> nil) then showmessage();

Holger
Loading...