AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Systemfehler. Code 1400. Ungültiges Fensterhandle. Und nu?

Systemfehler. Code 1400. Ungültiges Fensterhandle. Und nu?

Ein Thema von Tyler · begonnen am 9. Mai 2005 · letzter Beitrag vom 7. Okt 2019
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von Tyler
Tyler

Registriert seit: 19. Jun 2003
Ort: Berlin
241 Beiträge
 
#1

Systemfehler. Code 1400. Ungültiges Fensterhandle. Und nu?

  Alt 9. Mai 2005, 12:29
Salut

die o.g. Fehlermeldung der Klasse "EOSError"
Zitat:
Systemfehler. Code 1400. Ungültiges Fensterhandle. Und nu?
erhalte ich, wenn ich mein Programm schliesse.

Der Fehler tritt aber nur auf, wenn ich vorher im Programm folgendes "Feature" auslöse:
In einem Formular (MDIChild) wird folgende Proc aufgerufen:
Delphi-Quellcode:
procedure Tf_Vorgangsbuch.DOSUpdate1Click(Sender: TObject);
begin
{ Erstmal schauen, ob das Update ansich schon läuft (MySQL-Importer erstellt
die genannte Dummy-Datei, die nach Beendigung wieder entfernt wird - weiterhin
wird geprüft, ob nicht schon ein Update eines anderen Moduls läuft, und die TCPServer-Kompo
frei ist}

  if (NOT FileExists('y:\mysqlimporter\test\dummy_p_vorgangsbuch')) AND
     (NOT f_main.TcpServer.Active) then
  begin
    f_main.TcpServer.Active := True;

    ShellExecute(
      f_vorgangsbuch.handle,
      'open',
      PChar('psexec.exe'),
      PChar('\\testserver -i -w y:\mysqlimporter\test\ -d ' +
        ' y:\mysqlimporter\test\import.exe ' +
        ' J:\test\vorgbuch.dbf p_vorgangsbuch Ja ' +
        f_main.getIPs[0] ),
      PChar('y:\mysqlimporter\test\'),
      SW_SHOW);
  end else
    ShowMessage(' Update wird bereits ausgeführt! ');
end;
FYI: Auf dem Server existiert ein kleines Programm, welches DBF-Dateien ausliest und in eine MySQL-DB schreibt. Das Programm läuft einerseits per Taskmanager selbständig, um einige Datenbanken regelmäßig zu aktualisieren, anderersets, wenn es mit Parametern aufgerufen wird, kann es eine beliebige DBF-Datei auf meinen MySQL-Server schieben. Da das Programm aber auf den Clients sehr langsam läuft, wird es über PSEXEC "remote" auf dem Server ausgeführt.
Bisher ist das alles noch ganz einfach. Nun will man aber auch wissen, wie weit das Update ist. Zu dem Zweck hab ich mein Hauptprogramm und meinen MySQL-Importer mit den jeweiligen TCP-Komponenten ausgestattet, um miteinander zu kommunizieren:

Dazu läuft in der Hauptform meines "grossen" Progs folgendes ab:
Delphi-Quellcode:
procedure Tf_main.TcpServerAccept(Sender: TObject;
  ClientSocket: TCustomIpClient);
begin
  Progress.Visible := True;

  Progress.Max := StrToInt( ClientSocket.Receiveln );

  while ClientSocket.Receiveln <> 'EOFdo
  begin
    Progress.Position := StrToInt( ClientSocket.Receiveln )
  end;

  TcpServer.Active := False;
  Progress.Visible := False;

end;
FYI: Der MySQL-Importer schickt also an die IP des Hauptprogrammes zuerst die Anzahl der gesamten Datensätze und dann jeweils den aktuellen Stand der Dinge, um halt das ganze in einer Progressbar visuell dazustellen. Sieht man ja denke ich ganz einfach am Code... oder?
Der letzte String jedenfalls ist ein "EOF" damit das HAuptprogramm weiss: Hier ist SChluss. Fertig.

Nun, diese Skript läuft halt einmal durch, ohne Fehlermeldungen etc.pp. Und wenn ich dann das Programm schliesse, kommt eben die o.g. Fehlermeldung. Ich vermute mal, dass hier meine tolles "Update"-Feature irgendwo nicht ganz astrein ist, weil wenn ich das nicht ausgeführt habe, gibts die Fehlermeldung auch nicht!

Jemand ne Idee?


Danke!
Tyler
  Mit Zitat antworten Zitat
Benutzerbild von Kedariodakon
Kedariodakon

Registriert seit: 10. Sep 2004
Ort: Mönchengladbach
833 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Systemfehler. Code 1400. Ungültiges Fensterhandle. Und n

  Alt 9. Mai 2005, 12:59
hmm vielleicht vergisst du was freizugeben und es versucht sich selbst freizugeben, was aber fehlschlägt weil der Owner vielleicht schon lange zerstört ist?
Oder ka wie dieser Fehler zustande kommt ^^
Schon mal debuged?

Ich glaube das Problem liegt eher im Constructor / Destructor als in den zwei Funktionen ^^
den dort kann ich keine nennenswerten Fehler entdecken...

Aber!!!
Zitat von Active (Eigenschaft von TBaseSocket):
...Zur Entwurfszeit weisen Sie Active den Wert true zu, um den Socket beim Start der Anwendung für eine Verbindung zu öffnen (der Standardwert ist false). Zur Laufzeit verwenden Sie die Methoden Open und Close, um die Verbindung zu öffnen bzw. zu schließen.
bye
Christian
  Mit Zitat antworten Zitat
Benutzerbild von Tyler
Tyler

Registriert seit: 19. Jun 2003
Ort: Berlin
241 Beiträge
 
#3

Re: Systemfehler. Code 1400. Ungültiges Fensterhandle. Und n

  Alt 9. Mai 2005, 14:14
hm... also ich hab jetzt die Methode aus deinem Zitat verwendet, und den TCP Server mit "OPEN" aktiviert. Das führte zu keiner Lösung. Dafür aber das auskommentieren genau dieser Zeile in der Prozedur meiner MDI_Child-Formulars.

Scheint also daran zu liegen, das der Aufruf zwar vom Child aufgerufen, aber im Hauptformular wieder beendet wird, was dem TCPServer wohl missfählt.

Bleibt mir wohl nichts anderes übrig, als in jedem MDI-Child eine eigene TCPServer Komponente einzubauen, eine andere Möglichkeit sehe ich leider nicht, ohne z.B. mit einem Timer permanent irgendwelche Flags abzufragen...



tyler

//EDIT

doch... die Proc wird einfach in die Hauptunit ausgelagert, und die MDIChilds greifen per Verweis drauf zu... das müsste funktionieren.
  Mit Zitat antworten Zitat
Benutzerbild von Kedariodakon
Kedariodakon

Registriert seit: 10. Sep 2004
Ort: Mönchengladbach
833 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Systemfehler. Code 1400. Ungültiges Fensterhandle. Und n

  Alt 9. Mai 2005, 14:27
Zitat von Tyler:
...
Scheint also daran zu liegen, das der Aufruf zwar vom Child aufgerufen, aber im Hauptformular wieder beendet wird, was dem TCPServer wohl missfählt.
...
hmm gut möglich vor allem wenns beendet wurde obwohl das Child noch was machen möchte mit ^^

Zitat von Tyler:
...
doch... die Proc wird einfach in die Hauptunit ausgelagert, und die MDIChilds greifen per Verweis drauf zu... das müsste funktionieren.
...
Ist sogar eleganter, meiner Meinung nach



Konntest du den die Fehlerstelle genau finden?



Bye
Christian
  Mit Zitat antworten Zitat
Benutzerbild von Tyler
Tyler

Registriert seit: 19. Jun 2003
Ort: Berlin
241 Beiträge
 
#5

Re: Systemfehler. Code 1400. Ungültiges Fensterhandle. Und n

  Alt 9. Mai 2005, 14:33
hm... leider war das auch nicht die optimale Lösung.

Die Fehlerstelle war btw. das "TCPServer.Close" in der Prozedure "OnAccept" siehe oben.

Jetzt wird, wie erwähnt, aus meinem MDIChild eine Action in der Hauptunit ausgelöst. Diese Action wiederum macht das, was vorher das MDIChild gemacht hat, es öffnet seinerseits den TCPServer.
Es kommt weiterhin zu der Fehlermeldung, offensichtlich deshalb, weil der TCPServer in 2 unterschiedlichen Proceduren geschlossen und geöffnet wird.... Dumme Falle.. Zwickmühle??
Also werd ich wohl doch einen Timer einbauen, der von ausserhalb wieder für ein Schliessen des TCP Servers sorgt...


tyler
  Mit Zitat antworten Zitat
Benutzerbild von Kedariodakon
Kedariodakon

Registriert seit: 10. Sep 2004
Ort: Mönchengladbach
833 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Systemfehler. Code 1400. Ungültiges Fensterhandle. Und n

  Alt 9. Mai 2005, 15:14
Zitat von Tyler:
...
weil der TCPServer in 2 unterschiedlichen Proceduren geschlossen und geöffnet wird.
...
Das is doch weniger wild, eigendlich zumindest!

Schau doch einfach ob er connected ist, dann brauch er nicht mehr geöffnet werden, und beim schließen schau nach ob er schon geschlossen ist...

Dabei beachte aber, das der nicht geschlossen werden darf wenn er mit irgendwas noch nicht fertig ist, sprich setze nen Flag irgendwo ob er geschlossen werden darf...

Bye
Christian
  Mit Zitat antworten Zitat
Benutzerbild von Tyler
Tyler

Registriert seit: 19. Jun 2003
Ort: Berlin
241 Beiträge
 
#7

Re: Systemfehler. Code 1400. Ungültiges Fensterhandle. Und n

  Alt 9. Mai 2005, 15:56
Ich hab jetzt nochmal geschaut, und hier noch einmal zur Übersicht _alle_ Procs die mit TCPServer auch nur indirekt zu tun haben:

Im MDICHild wird die Action der Hauptunit aufgerufen:

  f_main.ac_UpdateExecute(Self); Das wars von der Seite, jetzt die Action in der Hauptunit, die hier den TCPServer aktiviert, der eben auch in der Hautpunit liegt:

Delphi-Quellcode:
procedure Tf_main.ac_UpdateExecute(Sender: TObject);
begin
  if (NOT FileExists('y:\mysqlimporter\test\dummy_p_vorgangsbuch')) AND
     (NOT f_main.TcpServer.Active) then
  begin
    TcpServer.Open;

    ShellExecute(
      f_vorgangsbuch.handle,
      'open',
      PChar('psexec.exe'),
      PChar('\\testserver -i -w y:\mysqlimporter\test\ -d ' +
        ' y:\mysqlimporter\test\import.exe ' +
        ' J:\test\test\vorgbuch.dbf p_vorgangsbuch Ja ' +
        f_main.getIPs[0] ),
      PChar('y:\mysqlimporter\test\'),
      SW_SHOW);
  end else
    ShowMessage(' Update wird bereits ausgeführt! ');
end;
und das Ereignis "ONACCEPT" des TCPServer, in dem sich seit dem letzten siehe oben nichts geändert hat.

Heisst also im Klartext, in der Action wird der TCPServer aktiviert, und im TCPServer wird er wieder deaktiviert. Sonst gibts definitiv keine anderen Zugriffe von irgendwoher. Die Frage ist, warum das nicht so sein darf?

Ich hab jetzt wie gesagt mal folgendes probiert:
Delphi-Quellcode:
procedure Tf_main.ac_UpdateExecute(Sender: TObject);
begin
  if (NOT FileExists('y:\mysqlimporter\test\dummy_p_vorgangsbuch')) AND
     (NOT f_main.TcpServer.Active) then
  begin
    TcpServer.Open;

  (...)


  TCPServer.Close;

end;
was meine Theorie nur bekräftigt, dass schlicht und ergreifend nur aus einer und derselben prozedure der Server gesteuert werden darf.
DAs ist natürlich doof, denn wie soll ich nun meine Progressbar realisieren, die ja quasi übers Netzwerk "gesteuert" wird?


tyler
  Mit Zitat antworten Zitat
Benutzerbild von Tyler
Tyler

Registriert seit: 19. Jun 2003
Ort: Berlin
241 Beiträge
 
#8

Re: Systemfehler. Code 1400. Ungültiges Fensterhandle. Und n

  Alt 9. Mai 2005, 16:22
ich werd verrückt... das Ding [Anm.d.Verf.: TCPServer] steckt voller Überraschungen. Nun hab ich versucht ein wenig rum zu tricksen:
Folgendes steht jetzt in meiner Action:
Delphi-Quellcode:
  if (NOT FileExists('y:\mysqlimporter\pegel\dummy_p_vorgangsbuch')) AND
     (NOT f_main.TcpServer.Active) AND
     (NOT UpdateAktiv) then
  begin
    ...
    UpdateAktiv := True;

  end else begin
    ...
    TCPServer.Close;
    UpdateAktiv := False;
  end;
Heisst im Klartext, ich wollte einmal in der die Aktion auslösen, die den TCP Server zum Kommunizieren bringt. Im Event des TCP-Servers wiederum wird nun am Ende (nach der Schleife, siehe oben) wiederum die Action aufgerufen. (Zirkelverweis... eigentlich total unschön ^^)

Nun gibts die lustige Meldung:
"EInvalidOperation: Leinwand/Bild erlaubt kein Zeichen"

LoL? Welche Leinwand? Bild? Läuft im Hintergrund Photoshop? Nö, nicht wirklich... Hilfe :wacko:
  Mit Zitat antworten Zitat
Benutzerbild von Tyler
Tyler

Registriert seit: 19. Jun 2003
Ort: Berlin
241 Beiträge
 
#9

Re: Systemfehler. Code 1400. Ungültiges Fensterhandle. Und n

  Alt 11. Mai 2005, 11:08
*heul*

ich bin der Verzweiflung nahe.

Nun bin ich auf idTCPClient und Server von Indy umgestiegen, weil ja das Gerücht umgeht, die seien zuverlässiger. Hab mir auch mit Mühe und Not meine Proceduren zusammengebastelt, und bekomme nun 1. folgende Fehlermeldung:

"zeiüberschreitung beim beenden von thread"

wenn ich den idTCPServer in dessen Prozedure "TCPServerExecute" von Hand schliesse. Nehme ich das jedoch raus, erhalte ich, wie gehabt, die Fehlermeldung aus dem ThreadTitel. Hilfe! ICh weiss nicht mehr weiter - woran liegt das? Was mach ich falsch?


tyler
  Mit Zitat antworten Zitat
Benutzerbild von Tyler
Tyler

Registriert seit: 19. Jun 2003
Ort: Berlin
241 Beiträge
 
#10

Re: Systemfehler. Code 1400. Ungültiges Fensterhandle. Und n

  Alt 20. Mai 2005, 08:13
keiner ne Idee? Ich find sonst keinen Ausweg, ausser mit der Fehlermeldung zu leben *bibber*
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 20:11 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