![]() |
Systemfehler. Code 1400. Ungültiges Fensterhandle. Und nu?
Salut :)
die o.g. Fehlermeldung der Klasse "EOSError" Zitat:
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:
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.
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; 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:
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? :)
procedure Tf_main.TcpServerAccept(Sender: TObject;
ClientSocket: TCustomIpClient); begin Progress.Visible := True; Progress.Max := StrToInt( ClientSocket.Receiveln ); while ClientSocket.Receiveln <> 'EOF' do begin Progress.Position := StrToInt( ClientSocket.Receiveln ) end; TcpServer.Active := False; Progress.Visible := False; end; 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 :) |
Re: Systemfehler. Code 1400. Ungültiges Fensterhandle. Und n
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:
|
Re: Systemfehler. Code 1400. Ungültiges Fensterhandle. Und n
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. |
Re: Systemfehler. Code 1400. Ungültiges Fensterhandle. Und n
Zitat:
Zitat:
Konntest du den die Fehlerstelle genau finden? Bye |
Re: Systemfehler. Code 1400. Ungültiges Fensterhandle. Und n
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 |
Re: Systemfehler. Code 1400. Ungültiges Fensterhandle. Und n
Zitat:
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 |
Re: Systemfehler. Code 1400. Ungültiges Fensterhandle. Und n
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:
Delphi-Quellcode:
Das wars von der Seite, jetzt die Action in der Hauptunit, die hier den TCPServer aktiviert, der eben auch in der Hautpunit liegt:
f_main.ac_UpdateExecute(Self);
Delphi-Quellcode:
und das Ereignis "ONACCEPT" des TCPServer, in dem sich seit dem letzten siehe oben nichts geändert hat.
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; 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:
was meine Theorie nur bekräftigt, dass schlicht und ergreifend nur aus einer und derselben prozedure der Server gesteuert werden darf.
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; DAs ist natürlich doof, denn wie soll ich nun meine Progressbar realisieren, die ja quasi übers Netzwerk "gesteuert" wird? :( tyler |
Re: Systemfehler. Code 1400. Ungültiges Fensterhandle. Und n
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:
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 ^^)
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; 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: |
Re: Systemfehler. Code 1400. Ungültiges Fensterhandle. Und n
*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 |
Re: Systemfehler. Code 1400. Ungültiges Fensterhandle. Und n
keiner ne Idee? Ich find sonst keinen Ausweg, ausser mit der Fehlermeldung zu leben *bibber*
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:59 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz