Martin Wodrich <[EMAIL PROTECTED]> wrote on 03.12.05:

> Michael Heydekamp <[EMAIL PROTECTED]> schrieb am 03.12.05 um 01:45:

>> Daher besteht eine gewisse Chance, mit Geduld und Hartnaeckigkeit
>> die Stelle zu finden, die irgendwann bei XP2 dazu gefuehrt hat, dass
>> sie als einziges 16bit-XP dieses Problem irgendwann nicht mehr
>> hatten.

> Dann hoffen wir mal, das es eine wirkliche Loesung wird, und nicht
> eine Loesung die rein zufaellig funktioniert (siehe hinweis()).

Ich hab jetzt zunächst mal den vordergründigen Grund gefunden, warum
beim Beenden von XP2 die Fehlermeldung nicht mehr kommt (Commits vom 23.
+ 25.05.2000 in xp.pas):

----------8<----------
[...]

var pwcnt:byte;
    pwrc:boolean;
+   scr_orig:byte;

begin
+ scr_orig:=25;
+ scr_orig:=GetScreenLines;
  readpar;
  loadresource;

[...]

      AutoStop;
      FlushSmartdrive(true);
+     SetScreenLines(scr_orig);
      closedatabases;
      exitscreen(iif(ParNojoke,0,1));

[...]
----------8<----------

Ist jetzt nicht das originale Diff (die Variablen heißen da z.B.
anders), nur um deutlich zu machen, was inhaltlich gemacht wurde.

Kommentiert ist der Commit mit "auf urspruengliche Bildschirmzeilen
zuruecksetzen bei XP2/2".  Sieht mir nicht nach einem gezielten Fix für
das vorliegende Problem aus, leider sind aber auch bei XP2 die
Committexte nicht sehr aussagekräftig.  Die erste Anweisung
"scr_orig:=25;" erscheint mir außerdem völlig unsinnig, weil der Wert
unmittelbar danach sowieso wieder überschrieben wird.  Ursprünglich war
der Fix auch nur auf OS2 beschränkt ("{$IFDEF OS2}") und wurde erst beim
zweiten Commit auch auf DOS und Windows erweitert -- genauer gesagt auf
alle 16bit-Compilate ("{$IFNDEF WIN32}").

Jedenfalls wird die ursprüngliche Zeilenanzahl ermittelt und nach
Beendigung von XP via 'setscreenlines' wieder zurückgesetzt -- im
Prinzip.  Warum das bei XP2 allerdings diese Fehlermeldung beim Beenden
in der DOS-Box verhindert, weiß ich noch nicht, denn:

Derselbe Code hat in FreeXP (getestet mit dem aktuellen Main Branch)
nicht die erhoffte Wirkung.  Allerdings sind gerade die Video-Routinen
wie 'setscreenlines' in FreeXP mittlerweile sowohl von Inhalt als auch
von der Struktur her völlig anders als in XP2 -- und weit fehlerärmer,
auch wenn das angesichts dieser Windows-Fehlermeldung jetzt etwas
komisch klingen mag.  Aber eine kurze Demo dazu:

DOS-Fenster starten und dort unter "Ursprüngliche Größe" im Reiter
"Bildschirm" den Wert "43 Zeilen" einstellen.  DOS-Fenster beenden und
wieder starten => das DOS-Fenster (und auch das Vollbild) haben jetzt 43
Zeilen.  In diesem 43-Zeilen-Fenster jetzt ein XP2 starten, das auf 28
Zeilen eingestellt ist => die untere Menüleiste von XP2 ist nicht mehr
sichtbar, sonden befindet sich unsichtbar unterhalb der
Fensterbegrenzung -- und das sogar im Vollbild.

Dasselbe Szenario mit FreeXP: Fenster wird korrekt resized, Menüleiste
ist sowohl im Fenster als auch im Vollbild sichtbar.

Und übrigens kann man auch mit jedem aktuellen XP2, das den oben
geposteten Code enthält, dieselbe Windows-Fehlermeldung beim Beenden
provozieren, wenn man es aus dem Explorer heraus startet: Nämlich genau
dann, wenn man dafür sorgt, daß die _DEFAULT.PIF im PIF-Verzeichnis
(oder eine XP.PIF im XP2-Verzeichnis) ebenfalls 43 (oder 50) Zeilen als
ursprüngliche Größe hat (und die übrigen hier besprochenen Parameter
"Dynamische Arbeitsspeicherreservierung" und "Beim Beenden schließen"
entsprechend gesetzt sind).  Dann versucht XP2 nämlich, den 43-Zeilen- 
Modus wiederherzustellen, und das führt dann genau wie bei allen anderen
Versionen zu exakt derselben Fehlermeldung.  Es geht also nur gut, wenn
der Ausgangsmodus zufällig 25 Zeilen war (schon deshalb glaube ich nicht
an einen gezielten, sondern eben eher zufälligen "Fix"), und in
'setscreenlines' von XP2 sehen wir:

----------8<----------
[...]
    3 : begin
          case lines of
            25     : loadcharset(16);
            26     : setuserchar(15);
            27..28 : loadcharset(14);
            29..30 : setuserchar(13);
            31..33 : setuserchar(12);
            34..36 : setuserchar(11);
            37..40 : setuserchar(10);
            41..44 : setuserchar(9);
            45..50 : loadcharset(8);
            51..57 : setuserchar(7);
[...]
----------8<----------

Bei FreeXP wird hingegen bei allen Zeilenmodi 'setuserchar()' aufgerufen
(wegen der internen Fonts, die bei allen Zeilenmodi geladen werden).   
Also führt offenbar 'loadcharset()' zum Vermeiden der Fehlermeldung und
'setuserchar()' zum Gegenteil?  Aber dann müßte XP2 auch bei einem
Ausgangswert von 50 Zeilen ohne Fehlermeldung zu beenden sein, aber das
ist seltsamerweise auch nicht der Fall, es kommt sogar zu einer "Doppel- 
Fehlermeldung".

Erstaunlich ist ja auch, daß 'setscreenlines' noch vor 'exitscreen'
aufgerufen wird und trotzdem irgendwas bewirkt, obwohl die Fehlermeldung
von Windows ja offenbar durch/während 'exitscreen' ausgelöst wird.

Jedenfalls passiert bei einem Ausgangswert von 25 Zeilen offenbar
irgendwas in 'setscreenlines', das in XP v3.12d und allen späteren
Versionen außer XP2 nicht passiert und diese Windows-Fehlermeldung
verhindert.  Was das ist, weiß ich noch nicht genau.

Ich hab mal das 'setcreenlines' von XP2 in FreeXP eingepflanzt (dazu
mußten etliche Subroutinen umbenannt werden), es 'resetscreenlines'
genannt und rufe in xp.pas an identischer Stelle jetzt eben
'resetscreenlines' auf: Das verhindert nun auch bei FreeXP die
Fehlermeldung beim Beenden (aber eben wie bei XP2 nur bei einem
Ausgangswert von 25 Zeilen und vermutlich sowieso nicht beim Poll mit
UKAW).

Jetzt geht's darum, weiter Genaueres herauszufinden.  Bleibe dran...

>> Ich kann als weitere Info nachreichen, dass mit einer von mir
>> compilierten aktuellen XP2-Version die Fehlermeldung nicht
>> provoziert werden kann.  Nur um auszuschliessen, dass es irgendwas
>> mit dem Compiler zu tun hat, es muss also schon am Code liegen.

> Die 16 Bit Versionen compilieren eh nur mit einem einzigen Compiler
> (BP7.01). Daher sind Compilerabhaengigkeiten sehr ungewwoehnlich.

Was weiß ich, was XP2 in xpdefine.inc definiert hat und was nicht. ;-)


        Michael
------------------------------------------------------------------------
FreeXP Support-Mailingliste
[email protected]
http://www.freexp.de/cgi-bin/mailman/listinfo/support-list

Antwort per Email an