Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Diese Anwendung wird aufgrund eines ungültigen Vorgangs ... (https://www.delphipraxis.net/53045-diese-anwendung-wird-aufgrund-eines-ungueltigen-vorgangs.html)

FriFra 9. Sep 2005 01:32


Diese Anwendung wird aufgrund eines ungültigen Vorgangs ...
 
Mein Programm läuft unter Windows NT, 2000, XP und 2003 ohne Fehler, aber unter Win98 (VMWare) bekomme ich an unterschiedlichen Stellen (mal läufts, mal crashts) die folgende Meldung:
Zitat:

Zitat von Diese Anwendung wird aufgrund eines ungültigen Vorgangs geschlossen.
Wenden Sie sich an den Hersteller, falls das Problem weiterhin besteht.

MYPROG verursachte einen Fehler durch eine ungültige Seite
in Modul <Unbekannt> bei 0000:00000000.
Register:
EAX=00000000 CS=0000 EIP=00000000 EFLGS=00000000
EBX=00000000 SS=0000 ESP=00000000 EBP=00000000
ECX=00000000 DS=0000 ESI=00000000 FS=0000
EDX=00000000 ES=0000 EDI=00000000 GS=0000
Bytes bei CS:EIP:

Stapelwerte:

Danach hilft nur noch ein Reset :evil: ... Was mir Windows mit dieser Fehlermeldung sagen will, erschließt sich mir jedoch auch nicht :roll:

Ich habe on Create meines Form die WndProc meiner ProgressBar überschrieben:
Delphi-Quellcode:
    OldProgressWndProc := ProgressBar1.WindowProc;
ProgressBar1.WindowProc := ProgressWndProc;

...

procedure TMyProg.ProgressWndProc(var Msg: TMessage);
var
  dc: HDC;
  rect: TRect;
  myfont: Cardinal;
  Text: string;
begin
  OldProgressWndProc(Msg);
  if ((Msg.Msg = 1026) or (Msg.Msg = WM_PAINT)) and (Timer3.Enabled = False)
    then
    // Wenn die Progressbar neugezeichnet wurde,
    // und somit die Zahl weg ist: Prozentzahl neu draufpinseln
  begin
    if (ProgressBar1.Max = 0) or (ProgressBar1.Position = 0) then
      Text := '0%'
    else if ProgressBar1.Max = ProgressBar1.Position then
      Text := '100%'
    else
      Text := IntToStr(Trunc(100 / ProgressBar1.Max * ProgressBar1.Position))
        + '%';
    dc := GetWindowDC(Progressbar1.Handle);
    try
      rect := ProgressBar1.ClientRect;
      //InvalidateRect(Progressbar1.Handle, @rect, True);
      myfont := CreateFont(MyProg_Main.Font.Size {-11}, 0, 0, 0, 0, 0, 0, 0,
        ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
        DEFAULT_PITCH, PAnsiChar(MyProg_Main.Font.Name) {'Verdana'});
      if suiSkinEngine1.Active = True then
        SetBkMode(dc, TRANSPARENT);
      SetTextColor(dc, clBlack);
      SelectObject(dc, myfont);
      DrawText(dc, PChar(Text), length(Text), rect, DT_SINGLELINE or DT_VCENTER
        or DT_CENTER);
    finally
      DeleteObject(myfont);
      ReleaseDC(Progressbar1.Handle, dc);
    end;
  end;
end;
Wenn ich die WndProc nicht überschreibe, dann läuft das Programm ohne Probleme. Was kann bei dieser Funktion unter Win9x einen kompletten Systemabsturz verursachen :roll: :gruebel:

Luckie 9. Sep 2005 02:57

Re: Diese Anwendung wird aufgrund eines ungültigen Vorgangs
 
Such mal hier im Forum nach madschis madCollection und bau die ein. dann bekommst du eine wesentlich aussagekräftigere Fehlermeldung.

da fällt mir noch ein: Anstatt
Delphi-Quellcode:
OldProgressWndProc(Msg);
eventuell mal die ursprüngliche mit
Delphi-Quellcode:
inherited(..);
aufrufen.

turboPASCAL 9. Sep 2005 03:06

Re: Diese Anwendung wird aufgrund eines ungültigen Vorgangs
 
Möglicherweise liegt das am Aufruf der OldWndProc.

Versuche es mal so:

Delphi-Quellcode:
NewProgressProc := CallWindowProc(OldProgressProc...

Flocke 9. Sep 2005 07:05

Re: Diese Anwendung wird aufgrund eines ungültigen Vorgangs
 
Zitat:

Zitat von Luckie
da fällt mir noch ein: Anstatt
Delphi-Quellcode:
OldProgressWndProc(Msg);
eventuell mal die ursprüngliche mit
Delphi-Quellcode:
inherited(..);
aufrufen.

Geht doch nicht, weil er WindowProc ersetzt; und weil er die Klasse ProgressBar nicht erweitert hat.

Zitat:

Zitat von turboPASCAL
Möglicherweise liegt das am Aufruf der OldWndProc.

Versuche es mal so:
Delphi-Quellcode:
NewProgressProc := CallWindowProc(OldProgressProc...

Nein, das würde nicht funktionieren. Das ist ja keine Windows-Fensterprozedur sondern eine TWndMethod.

Der Vorschlag mit madExcept ist gut, da siehst du genau, wo der Fehler auftritt.

[Nachtrag]

Was mir jetzt spontan auffällt ist, dass du nur ein SelectObject machst.
Delphi-Quellcode:
SelectObject(dc, myfont);
Normalerweise macht man so etwas wieder rückgängig:
Delphi-Quellcode:
oldfont := SelectObject(dc, myfont);
DrawText(...);
SelectObject(dc, oldfont);
Außerdem: warum erzeugst du den Font selbst und holst ihn dir nicht einfach von deinem Hauptformular?
Delphi-Quellcode:
myfont := MyProg_Main.Font.Handle
(dann aber natürlich das DeleteObject weglassen).

FriFra 9. Sep 2005 22:43

Re: Diese Anwendung wird aufgrund eines ungültigen Vorgangs
 
Zitat:

Zitat von Luckie
Such mal hier im Forum nach madschis madCollection und bau die ein. dann bekommst du eine wesentlich aussagekräftigere Fehlermeldung.

Hm... Ich hab jetzt madExcept installiert, nur weiß ich nicht so recht wohin :roll:
Lt. Hilfe müste nun in derIDE irgendwo im Projektmenü (?) ein Eintrag sein, ist er aber nicht, auch unter Start->Programme ist nichts :gruebel:

turboPASCAL 9. Sep 2005 23:01

Re: Diese Anwendung wird aufgrund eines ungültigen Vorgangs
 
Was hast du installiert, alles oder nur die Basics ?

FriFra 9. Sep 2005 23:03

Re: Diese Anwendung wird aufgrund eines ungültigen Vorgangs
 
Die Basics inkl. Madexcept...

turboPASCAL 9. Sep 2005 23:13

Re: Diese Anwendung wird aufgrund eines ungültigen Vorgangs
 
Installier mal alles, notfalls ist da ja noch das uninstall... das sollte dann passen :wink:

ich kann dir nicht genau sagen welche(s) tool du instalieren musst damit es sich in das Menue instalieret


// edit

Instalieren must du:
madBasics
madDisAsm
madExcept

...dann bekommst du einen neuen Paletteneintrag [madshi] MadExceptionHandler und unter Menue -> Projekte -> madExcept Settings...

FriFra 10. Sep 2005 10:50

Re: Diese Anwendung wird aufgrund eines ungültigen Vorgangs
 
Zitat:

Zitat von turboPASCAL
Instalieren must du:
madBasics
madDisAsm
madExcept

...dann bekommst du einen neuen Paletteneintrag [madshi] MadExceptionHandler und unter Menue -> Projekte -> madExcept Settings...

Genau die habe ich installiert, aber ich habe weder einen Paletteneintrag, noch einen Menüeintrag :gruebel: :evil:

turboPASCAL 10. Sep 2005 12:26

Re: Diese Anwendung wird aufgrund eines ungültigen Vorgangs
 
:gruebel: dann installier doch mal alles...


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:09 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz