AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi EOSError, Code 1400, Ungültiges Fensterhandle - Kosole
Thema durchsuchen
Ansicht
Themen-Optionen

EOSError, Code 1400, Ungültiges Fensterhandle - Kosole

Ein Thema von haui95 · begonnen am 17. Jun 2012 · letzter Beitrag vom 17. Jun 2012
Antwort Antwort
haui95

Registriert seit: 1. Feb 2012
Ort: Niedersachsen
29 Beiträge
 
Delphi 7 Personal
 
#1

EOSError, Code 1400, Ungültiges Fensterhandle - Kosole

  Alt 17. Jun 2012, 14:14
Guten Tag,

ich habe mir ein Programm geschrieben das den BMI berechnen soll. Dabei habe ich ein Splashscreen und einen eigenen Info Dialog über das Programm erstellt, um dieses ein bisschen aufzuwerten. Nun habe ich das Hauptprogramm, den Splashscreen und den Info Dialog jeweils in eine DLL ausgelagert und statisch eingebunden. Um den Splashscreen nun aufzurufen, der wiederrum das Hauptprogramm nach dem Laden startet, habe ich eine weitere Konsolenanwendung erstellt. Die Konsolenanwendung ruft den Splashscreen in einem Try-Block auf. Das Programm startet auch, es funktioniert und es lässt sich über einen Button wieder schließen. Nur das einzige Problem, welches ich jetzt noch habe ist, dass ich eine Exception bekomme, wenn ich das Programm über das Schließen Kreuz der Konsole beenden möchte, da die Konsole ja bis zum Ende des Programms offen bleibt. EOSError, Code 1400, Ungültiges Fensterhandle. Könnte man der Konsole nicht sagen, was diese machen soll, wenn man sie schließt (ähnlich wie ein on Close-Event) , z.B. alle offenen Threads beenden und entladen.

MfG

Hauke
Hauke
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke
Online

Registriert seit: 10. Jun 2003
Ort: Berlin
9.650 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: EOSError, Code 1400, Ungültiges Fensterhandle - Kosole

  Alt 17. Jun 2012, 14:44
Dafür gibt es SetConsoleCtrlHandler:
http://msdn.microsoft.com/en-us/libr.../ms686016.aspx
Aber irgendwie hört sich das sehr seltsam an. Ich sehe keinen Sinn darin eine Konsole anzuzeigen, wenn du eine GUI benutzt... Das verwirrt doch nur den Benutzer und macht Probleme wie dieses.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
haui95

Registriert seit: 1. Feb 2012
Ort: Niedersachsen
29 Beiträge
 
Delphi 7 Personal
 
#3

AW: EOSError, Code 1400, Ungültiges Fensterhandle - Kosole

  Alt 17. Jun 2012, 14:58
Danke für deine Antwort. Jetzt geht es endlich

Delphi-Quellcode:
program Project1;

uses
  Windows, SysUtils, Classes, XPMan;

{$APPTYPE CONSOLE}

{$R *.RES}

procedure ShowSplashForm; stdcall; external 'splash.dll';

function ConsoleEventProc(CtrlType: DWORD): BOOL; stdcall;
begin
  if (CtrlType = CTRL_CLOSE_EVENT) then
    begin
      exit;
    end;
  Result := True;
end;

begin
  SetConsoleCtrlHandler(@ConsoleEventProc, True);
  try
    ShowSplashForm;
  except
    exit;
  end;
end.
Könntest du mir vielleicht sagen, wie man diese splash.dll in meinem Beispiel noch anders aufrufen könnte ohne eine Konsole zu verwenden ?
Hauke
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

AW: EOSError, Code 1400, Ungültiges Fensterhandle - Kosole

  Alt 17. Jun 2012, 15:15
Indem du keine Konsolenanwendung schreibst?

{$APPTYPE CONSOLE} weglassen.


Meckert dein Delphi nicht darüber, daß du Result nicht initialisierst?

Zitat:
Delphi-Quellcode:
function ConsoleEventProc(CtrlType: DWORD): BOOL; stdcall;
begin
  if (CtrlType = CTRL_CLOSE_EVENT) then
    begin
      exit;
    end;
  Result := True;
end;
Auf was wird Result wohl stehen, wenn das Exit zuschlägt?

Genau, auf einem Zufallswert.
$2B or not $2B

Geändert von himitsu (17. Jun 2012 um 15:40 Uhr)
  Mit Zitat antworten Zitat
haui95

Registriert seit: 1. Feb 2012
Ort: Niedersachsen
29 Beiträge
 
Delphi 7 Personal
 
#5

AW: EOSError, Code 1400, Ungültiges Fensterhandle - Kosole

  Alt 17. Jun 2012, 15:23
Danke himitsu,

ich bin gerade echt verzweifelt, da ich mich selbst frage, warum ich nicht gleich darauf gekommen bin Aber eigentlich ist es ja ganz logisch, dass man dieses {APPTYPE CONSOLE} einfach weglässt

Hmm.. mein Delphi meint lediglich nur, dass der Rückgabetyp der Funktion undefiniert sei, trotzdem schließt die Konsole ordnungsgemäß. :/
Jedoch hast du Recht, dass ich Result zuerst initialisieren sollte. Delphi hat ja nicht viele Möglichkeiten einen Zufallswert zu erstellen, es gibt ja nur True und False. Normalerweise müsste es somit eine 50 Prozentige Chance geben, dass sich die Konsole ordnungsgemäß schließt .

Danke noch einmal für eure Hilfe !

MfG

Hauke
Hauke

Geändert von haui95 (17. Jun 2012 um 15:32 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

AW: EOSError, Code 1400, Ungültiges Fensterhandle - Kosole

  Alt 17. Jun 2012, 15:39
dass der Rückgabetyp der Funktion undefiniert sei, trotzdem schließt die Konsole ordnungsgemäß. :/
Genau.

Mit dem Zufall ist es soein Ding, denn ein Computerprogramm kennt eigentlich keinen echten Zufall.
In deinem Fall kommt es drauf an, was schon vor Prozeduraufruf im EAX-Register drinsteht (wenn du Glück hast, dann ist es "zufällig" eine 0) und das steht dann im Fall vom Exit auch im Result.
Also einfach vorher auf False setzen.
$2B or not $2B
  Mit Zitat antworten Zitat
haui95

Registriert seit: 1. Feb 2012
Ort: Niedersachsen
29 Beiträge
 
Delphi 7 Personal
 
#7

AW: EOSError, Code 1400, Ungültiges Fensterhandle - Kosole

  Alt 17. Jun 2012, 15:43
Habe es nun noch einmal probiert mit einem Result := False; als Initialisierung. Jedoch kommt nun wieder eine Excption EOSError.
Lasse ich die Initialisierung weg, läuft das Programm und ich kann die Konsole ohne Fehler und Exceptions schließen.

Delphi-Quellcode:
program Project1;

uses
  Windows, SysUtils, Classes, XPMan;

{$APPTYPE CONSOLE}

{$R *.RES}

procedure ShowSplashForm; stdcall; external 'splash.dll';

function ConsoleEventProcedure(CtrlType: DWord): Bool; stdcall;
begin
  Result := False; // <-- Löst Exception aus !?
  if (CtrlType = CTRL_CLOSE_EVENT) then
    begin
      exit;
    end;
  Result := True;
end;

begin
  SetConsoleCtrlHandler(@ConsoleEventProcedure, True);
  try
    ShowSplashForm;
  except
    exit;
  end;
end.
Delphi-Quellcode:
program Project1;

uses
  Windows, SysUtils, Classes, XPMan;

{$APPTYPE CONSOLE}

{$R *.RES}

procedure ShowSplashForm; stdcall; external 'splash.dll';

function ConsoleEventProcedure(CtrlType: DWord): Bool; stdcall;
begin
  Result := False;
  if (CtrlType = CTRL_CLOSE_EVENT) then
    begin
      exit;
      Result := True; // <-- so geht's ! :D
    end;
end;

begin
  SetConsoleCtrlHandler(@ConsoleEventProcedure, True);
  try
    ShowSplashForm;
  except
    exit;
  end;
end.

MfG
Hauke

Geändert von haui95 (17. Jun 2012 um 15:55 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#8

AW: EOSError, Code 1400, Ungültiges Fensterhandle - Kosole

  Alt 17. Jun 2012, 20:25
Result := False; = Ich hab nix gemacht, sag dem nächsten registrieren Handler, er soll's behandeln oder laß es den Defaulthandler machen.

Result := True; = Ich ab das Ereignis behandelt und die anderen Handler/DehailtHandler sollen nix mehr machen.



Das :=True, nach dem Exit hat keinerlei Wirkung und es wird immer nur False zurückgegeben, womit dein Handler eigentlich gantichts macht, also im Prinzip könnte man das Ganze auch einfach weglassen.
Ermacht ja sowieso überhaupt nix.
Due solltest vielleicht auch nochmal in Delphi-Referenz durchsuchenSetConsoleCtrlHandler => HandlerRoutine alles durchlesen, vorallem die Remarks.
$2B or not $2B

Geändert von himitsu (17. Jun 2012 um 21:13 Uhr)
  Mit Zitat antworten Zitat
haui95

Registriert seit: 1. Feb 2012
Ort: Niedersachsen
29 Beiträge
 
Delphi 7 Personal
 
#9

AW: EOSError, Code 1400, Ungültiges Fensterhandle - Kosole

  Alt 17. Jun 2012, 22:27
Stimmt Ich sage der Konsole ja nur, dass sie alle offenen Threads beim Beenden des Programms schließen soll. In diesem Fall macht es also keinen Sinn die Handler Routine CTRL_CLOSE_EVENT oder auch den Befehl exit mit einer Booleschen Abfrage zu verknüpfen, da sich das Programm eh nur schließen soll. Die Funktion selbst kommt schon gar nicht mehr dazu den positiven Rückgabewert zu verarbeiten.

So, habe den Rückgabetyp nun aus der Funktion entfernt und siehe da, es läuft immer noch

Vielen Dank himitsu für den Hinweis.

MfG

Hauke
Hauke
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:29 Uhr.
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