Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

check Summe ermitteln klappt nicht

2 views
Skip to first unread message

Jens Kallup

unread,
Dec 27, 2021, 8:05:12 AM12/27/21
to
Hallo,

leider stürtzt das Programm in der unten aufgeführten Funktion
immer ab - bei @checksum in der ShowMessage.
Dort möchte ich gerne eine CheckSum anzeigen.
Danke für Tipps.
Jens

function ComputePEChecksum(FileName: string): DWORD;
var
h, hMap: Cardinal;
pMem: Pointer;
headersum, fsizehigh, fileSizeLow: DWORD;
checksum: PDWORD;
nth: PImageNtHeaders;
p: Pointer;
s: String;
Label
cleanup;
begin
pMem := nil;

Result := 0;

headersum := 0;
checksum := nil;

h := Windows.CreateFile(PChar(FileName), GENERIC_READ, FILE_SHARE_READ,
nil, OPEN_EXISTING, 0, 0);
if (h = INVALID_HANDLE_VALUE) then
begin
ShowMessage('internal error.');
Windows.ExitProcess(1);
end;

fileSizeLow := Windows.GetFileSize(h, @fsizehigh);

hMap := Windows.CreateFileMapping(h, nil, PAGE_READONLY, fsizeHigh,
fileSizeLow, nil);
if (hMap = 0) then
goto cleanup;

pMem := Windows.MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0);
if (pMem = nil) then
goto cleanup;

nth := CheckSumMappedFile(pMem, fileSizeLow, @headersum, @checksum);

if (nth = nil) then
checksum := nil;

showmessage(
'size res: ' + IntToStr(fileSizeLow) + #13 +
'size arg: ' + IntToStr(fsizeHigh ) + #13#13 +
'checksum: ' + PChar(checksum^));

cleanup:
if (pMem <> nil) then
Windows.UnmapViewOfFile(pMem);
if (hMap <> 0) then
Windows.CloseHandle(hMap);
if (h <> 0) then
Windows.CloseHandle(h);

Result := checksum^;
end;
kallup_jens.vcf

Andreas Niggemann

unread,
Dec 28, 2021, 3:31:34 AM12/28/21
to
In article <j2ts05...@mid.individual.net>, kallu...@web.de
says...

> leider stürtzt das Programm in der unten aufgeführten Funktion
> immer ab - bei @checksum in der ShowMessage.
> 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

unread,
Jan 10, 2022, 5:08:40 AM1/10/22
to
Am 27.12.2021 um 14:05 schrieb Jens Kallup:
> Hallo,
>
> leider stürtzt das Programm in der unten aufgeführten Funktion
> immer ab - bei @checksum in der ShowMessage.

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

Holger Schieferdecker

unread,
Jan 10, 2022, 5:18:18 AM1/10/22
to
Am 28.12.2021 um 09:31 schrieb Andreas Niggemann:
> In article <j2ts05...@mid.individual.net>, kallu...@web.de
> says...
>
>> leider stürtzt das Programm in der unten aufgeführten Funktion
>> immer ab - bei @checksum in der ShowMessage.
>> 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^));
>
> Versuchs mal mit:
> '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

Jens Kallup

unread,
Jan 10, 2022, 7:22:07 AM1/10/22
to
Am 10.01.2022 um 11:03 schrieb Holger Schieferdecker:
> Am 27.12.2021 um 14:05 schrieb Jens Kallup:
>> Hallo,
>
> Holger

Du meinst, dass finally am Programmende sowie beim
zurückgeben der "Result" aufgerufen wird?
Hmm, wenn ja, okay, kann man machen.

Jens
kallup_jens.vcf

Holger Schieferdecker

unread,
Jan 10, 2022, 7:45:39 AM1/10/22
to
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

unread,
Jan 10, 2022, 8:30:26 AM1/10/22
to
Am 10.01.2022 um 13:40 schrieb Holger Schieferdecker:

> 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.
kallup_jens.vcf
0 new messages