Für Windows ME? [gelöst]

Antworten
MmVisual
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]

Beitrag von MmVisual »

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
Zuletzt geändert von MmVisual am Do 6. Okt 2011, 13:33, insgesamt 1-mal geändert.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Hitman
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?

Beitrag von Hitman »

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.

MmVisual
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?

Beitrag von MmVisual »

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.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Hitman
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?

Beitrag von Hitman »

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.

MmVisual
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?

Beitrag von MmVisual »

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

MmVisual
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?

Beitrag von MmVisual »

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:

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

MmVisual
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?

Beitrag von MmVisual »

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.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Antworten