Beim Logging sehe ich das Problem, dass ja nur alle 5000 Zeilen gespeichert wird.
Bei einem Programmabsturz kann man also schlimmstenfalls die letzten 5000 Zeilen im Protokoll nicht nachvollziehen. Die letzten Infos vor dem Auftreten eines Fehlers gehen also verloren.
Daher ein Vorschlag für die Änderung der Fehlerprotokollierung (nur hingedaddelt und nicht getestet):
Delphi-Quellcode:
procedure TForm1.AddLine(s :
String);
var
f : TextFile;
iIOResult : Integer;
sLogFile :
String;
begin
// Der Name der LOG-Datei ändert sich stündlich.
// Wir schreiben die Meldungen sofort in eine Datei und speichern diese sofort.
// Dadurch sollte auch die letzte Meldung vor dem Auftreten eines Fehlers
// in der Datei einhalten sein.
sLogFile := Format('
%s%s.log',[programmpfad,FormatDateTime('
YYYYMMDD_HH',Now)]);
iIOResult := 0;
{$I-}
AssignFile(f,sLogFile);
try
try
if not FileExists(sLogFile)
then begin
ReWrite(f);
iIOResult := IOResult;
end else begin
Append(f);
iIOResult := IOResult;
end;
if iIOResult = 0
then begin
WriteLn(f,FormatDateTime('
yyyy.mm.dd hh.nn.ss,zzz',now),'
: ',s);
Flush(f);
iIOResult := IOResult;
CloseFile(f);
iIOResult := IOResult;
iIOResult := 0;
end;
except
on e : EOsError
do MessageDLG(e.
Message + #13#13 + SysErrorMessage(GetLastError),mtError,[mbOk],0);
on e :
Exception do MessageDLG(e.
Message,mtError,[mbOk],0);
end;
finally
if (iIOResult <> 0)
and (iIOResult <> 32)
then begin
MessageDLG(Format('
Fehler %d in AddLine.',[iIOResult]),mtError,[mbOK],0);
end;
end;
{$I+}
end;
Memo_Log wird zur Fehlerprotokollierung nicht mehr benötigt.
Absonsten kann ich momentan beim besten Willen nicht erkennen, woher da ein Programmabsturz ... kommen könnte.
Achso: Die Handles können ein Indikator für ein grundlegendes Problem sein, müssen es aber nicht.
Ein computerspezifisches Problem würd' ich hier eher nicht vermuten. Eher im Umfeld mit der
FTP-Kommunikation.
ShellExecute ist 'ne Funktion, deren Rückgabewert man auswerten kann (
https://docs.microsoft.com/en-us/win...hellexecutea):
Delphi-Quellcode:
procedure Tform1.start_bat(s:string);
var
iShellEx : Integer;
iSW : Integer;
begin
LogHandles('start_bat_begin');
case CheckBox_verstecke_cmd.Checked of
true : iSW := SW_HIDE;
false : iSW := SW_NORMAL;
end;
iShellEx := ShellExecute(Application.Handle, 'open', PChar(S), nil, nil, iSW);
AddLine_Debug(Format('ShellExecute: %s Rückgabewert: %d',[s,iShellEx]));
LogHandles('start_bat_ende');
end;