Für Windows ME? [gelöst]
-
- Beiträge: 1445
- Registriert: Fr 10. Okt 2008, 23:54
- OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
- CPU-Target: 32/64Bit
Für Windows ME? [gelöst]
Hallo,
Ich habe mit der aktuellen Snapshot Version / FPC 2.7.1 eine EXE erzeugt und jemand (nicht ich) möchte die unter Windows ME laufen lassen.
Die EXE geht an und kurze Zeit später stürzt irgend was hab und die EXE verschwindet. Unter XP..Win7 geht die EXE ohne Probleme.
Die Fehlermeldung: "Nach ca. 2 Minuten bekommt man eine KERNEL.EXE Fehlermeldung und das Programm ist beendet."
Woran kann das liegen?
Ich hab leider keine Testmöglichkeit für ME, hab nur noch XP.
Grüße Markus
Ich habe mit der aktuellen Snapshot Version / FPC 2.7.1 eine EXE erzeugt und jemand (nicht ich) möchte die unter Windows ME laufen lassen.
Die EXE geht an und kurze Zeit später stürzt irgend was hab und die EXE verschwindet. Unter XP..Win7 geht die EXE ohne Probleme.
Die Fehlermeldung: "Nach ca. 2 Minuten bekommt man eine KERNEL.EXE Fehlermeldung und das Programm ist beendet."
Woran kann das liegen?
Ich hab leider keine Testmöglichkeit für ME, hab nur noch XP.
Grüße Markus
Zuletzt geändert von MmVisual am Do 6. Okt 2011, 13:33, insgesamt 1-mal geändert.
EleLa - Elektronik Lagerverwaltung - www.elela.de
-
- Beiträge: 512
- Registriert: Mo 25. Aug 2008, 18:17
- OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
- CPU-Target: x86
- Wohnort: Chemnitz
Re: Für Windows ME?
Klingt nach fehlerhaften Speicherzugriffen. Windows 9x ist da im Gegensatz zu NT relativ schlecht geschützt und daher nicht sonderlich tolerant.
Empfehlung: selbst in einer VM Windows ME aufsetzen, dort versuchen zu reproduzieren und wenn das gelingt mit Debugger, HeapTrc, etc. laufen lassen.
Empfehlung: selbst in einer VM Windows ME aufsetzen, dort versuchen zu reproduzieren und wenn das gelingt mit Debugger, HeapTrc, etc. laufen lassen.
-
- Beiträge: 1445
- Registriert: Fr 10. Okt 2008, 23:54
- OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
- CPU-Target: 32/64Bit
Re: Für Windows ME?
HeapTrc hatte ich neulich schon ausgeführt (der andere Thread), da war nur ein einziges Problem drin und das trat nur beim Beenden der EXE auf, also es wurde eine StringListe, die während der Laufzeit benötigt wird nicht mehr frei gegeben, wenn die EXE geschlossen wurde.
Somit sollte die sauber sein.
Ich maile dennoch mal die bereinigte EXE, mal schauen was er schreibt.
Ich muss mal schauen, aber ich glaube ich habe ein ME auf CD hier rumliegen.
Somit sollte die sauber sein.
Ich maile dennoch mal die bereinigte EXE, mal schauen was er schreibt.
Ich muss mal schauen, aber ich glaube ich habe ein ME auf CD hier rumliegen.
EleLa - Elektronik Lagerverwaltung - www.elela.de
-
- Beiträge: 512
- Registriert: Mo 25. Aug 2008, 18:17
- OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
- CPU-Target: x86
- Wohnort: Chemnitz
Re: Für Windows ME?
Mit HeapTrc laufen lassen hat aber noch andere Konsequenzen, als nur, dir zum Schluss zu zeigen, was noch im Speicher war. Es überschreibt z.B. auch freigegebenen Speicher sofort (wodurch es auffallen sollte, wenn man auf einen bereits freigegebenen Bereich zugreift, da dann nur noch "Müll" rauskommt, was ohne HeapTrc aber in vielen Fällen noch gut gehen könnte).
Interessanter ist aber, es im Debugger laufen zu lassen, da der die Zugriffe wieder etwas einschränkt und vor allem reported.
Interessanter ist aber, es im Debugger laufen zu lassen, da der die Zugriffe wieder etwas einschränkt und vor allem reported.
-
- Beiträge: 1445
- Registriert: Fr 10. Okt 2008, 23:54
- OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
- CPU-Target: 32/64Bit
Re: Für Windows ME?
Guter Tipp, dann kompiliere ich die EXE mit HeapTrc und schicke die. Vermutlich kann er erst heute Abend testen.
EleLa - Elektronik Lagerverwaltung - www.elela.de
-
- Beiträge: 1445
- Registriert: Fr 10. Okt 2008, 23:54
- OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
- CPU-Target: 32/64Bit
Re: Für Windows ME?
Ich denke ich bin dem ME Problem etwas näher gekommen.
Die Logs die er aufgezeichnet haben weißen darauf hin, dass unter WinME das TFileStrem-Objekt nicht in eine Datei schreiben kann.
Das klappt nicht:
Auch die INI-Datei kann nicht geschrieben werden, ich nutze das ganze so damit UTF8-Tauglich:
Hier der Typ "TFileStreamUTF8":
Kann mir jemand schrieben warum das unter Win98/ME nicht klappt?
Muss ich da vielleicht testen welches Betriebssystem dahinter steht und andere Funktionen aufrufen?
Vielen Dank schonmal.
Die Logs die er aufgezeichnet haben weißen darauf hin, dass unter WinME das TFileStrem-Objekt nicht in eine Datei schreiben kann.
Das klappt nicht:
Code: Alles auswählen
ErrMessagesPath := ExtractFilePath(sAppExe) + 'Log';
If Not DirectoryExistsUTF8(ErrMessagesPath) Then
CreateDir(ErrMessagesPath);
: : :
Procedure ErrMessagesLog(strLogTxt : String);
Var F: LongInt;
s: String;
Begin
If ErrMessagesFile = '' Then
ErrMessagesFile := FormatDateTime('yymmdd', Now) + ' Log.txt';
If FileExists(ErrMessagesPath + ErrMessagesFile) Then
begin
F := FileOpen(ErrMessagesPath + ErrMessagesFile, fmOpenWrite);
End Else F := FileCreate(ErrMessagesPath + ErrMessagesFile);
FileSeek(F, 0, fsFromEnd);
s := TimeToStr(Now) + ' ' + strLogTxt + #13{$IFNDEF LINUX} + #10{$ENDIF};
FileWrite(F, s[1], Length(s));
FileClose(F);
End;
Auch die INI-Datei kann nicht geschrieben werden, ich nutze das ganze so damit UTF8-Tauglich:
Code: Alles auswählen
// INI Neu öffnen, damit klar ist wo sie ist "IniLocation"
If FileExistsUTF8(sParIniFile) Then
st := TFileStreamUTF8.Create(sParIniFile, fmOpenReadWrite)
Else st := TFileStreamUTF8.Create(sParIniFile, fmCreate);
ini := TIniFile.Create(st);
Hier der Typ "TFileStreamUTF8":
Code: Alles auswählen
Type
TFileStreamUTF8 = class(THandleStream)
Private
FFileName : String;
public
constructor Create(const AFileName: string; Mode: Word; Rights: Cardinal = 438);
destructor Destroy; override;
property FileName : String Read FFilename;
end;
constructor TFileStreamUTF8.Create(const AFileName: string; Mode: Word; Rights: Cardinal = 438);
Var hFile: THandle;
begin
FFileName:=AFileName;
If (Mode and fmCreate) = fmCreate then
Begin
If FileExistsUTF8(AFileName) Then
DeleteFileUTF8(AFileName);
hFile:=FileCreateUTF8(AFileName,Mode,Rights)
end
else
hFile:=FileOpenUTF8(AFileName,Mode);
If hFile=THandle(-1) then
If (Mode and fmCreate) = fmCreate then
raise EFCreateError.createfmt(SFCreateError,[AFileName])
else
raise EFOpenError.Createfmt(SFOpenError,[AFilename]);
inherited Create(hFile);
end;
destructor TFileStreamUTF8.Destroy;
begin
FileClose(Handle);
inherited Destroy;
end;
Kann mir jemand schrieben warum das unter Win98/ME nicht klappt?
Muss ich da vielleicht testen welches Betriebssystem dahinter steht und andere Funktionen aufrufen?
Vielen Dank schonmal.
EleLa - Elektronik Lagerverwaltung - www.elela.de
-
- Beiträge: 1445
- Registriert: Fr 10. Okt 2008, 23:54
- OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
- CPU-Target: 32/64Bit
Re: Für Windows ME?
Ich habe das Problem gefunden und gelöst.
Alle Dateioperationen habe ich jetzt so umgebogen, dass bei Win 95/98/ME nur die Ansi-Variante verwendet wird. Ab Win2000 wird die WideStrin-Variante genommen, dann klappt alles gut.
Alle Dateioperationen habe ich jetzt so umgebogen, dass bei Win 95/98/ME nur die Ansi-Variante verwendet wird. Ab Win2000 wird die WideStrin-Variante genommen, dann klappt alles gut.
EleLa - Elektronik Lagerverwaltung - www.elela.de