AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi "Ungültiges Fensterhandle (Code 1400)" wegen indy ftp
Thema durchsuchen
Ansicht
Themen-Optionen

"Ungültiges Fensterhandle (Code 1400)" wegen indy ftp

Ein Thema von Nogge · begonnen am 26. Okt 2006 · letzter Beitrag vom 28. Okt 2006
Antwort Antwort
Nogge

Registriert seit: 15. Jul 2004
336 Beiträge
 
Delphi 7 Professional
 
#1

"Ungültiges Fensterhandle (Code 1400)" wegen indy

  Alt 26. Okt 2006, 11:58
Hallo Community,
Ich erhalte die o.g. reproduzierbare Fehlermeldung, wenn ich meinen FTP-Server aus der TNA heraus wieder anzeigen lasse. ABER der Fehler tritt nur dann auf, wenn ich meinen FTP-Server sofort beim Programmstart minimiere (Autostart-Feature) und ein Client eine Verbindung zum FTP-Server aufgebaut hat.

Delphi-Quellcode:
[OnFormCreate]
begin
  if CB_Autostart.Checked then
  begin
    Application.ShowMainForm := false;
    AddTNAIcon('NoobFTP - Server');
    Open_FTP_Server;
  end;
end;

Procedure TF_Server.AddTNAIcon(const TNA_String: String);
begin
  with NIM do begin
    cbSize := SizeOf(NIM);
    Wnd := self.Handle;
    uID := 0;
    uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
    hIcon := Application.Icon.Handle;
    uCallbackMessage := WM_TASKBAREVENT;
    StrPCopy(szTip, TNA_String);
  end;
  Shell_NotifyIcon(NIM_ADD, @NIM);
end;

[Open_FTP_Server]
begin
  IdFTPServer1.Active := not IdFTPServer1.Active;
  if IdFTPServer1.Active then
  begin
    IdFTPServer1.MaxConnections := StrToIntDef(E_maxC.Text, 2);
    L_status.Caption := 'Status: opened';
    B_create.Caption := 'Close FTP Server';
  end;
end;

Procedure TF_Server.WMSysCommand(var Msg: TWMSysCommand);
Begin
  if (Msg.CmdType and $FFF0) = SC_MINIMIZE then
  begin
    self.Hide;
    //windows.ShowWindow(Application.Handle, SW_HIDE);
    //windows.ShowWindow(self.Handle, SW_HIDE);
    AddTNAIcon('NoobFTP - Server');
  end
  else
    inherited;
end;

Procedure TF_Server.WMTaskBarEvent(var Msg: TMessage);
Begin
  case Msg.LParamLo of
    WM_LBUTTONDBLCLK:
      begin
        self.Show;
        //windows.ShowWindow(self.Handle, SW_SHOW);
        //windows.ShowWindow(Application.Handle, SW_SHOW);
        Application.BringToFront;
        RemoveTNAIcon;
      end;
  End;
End;
Kann mir jemand erklären, wie diese Fehlermeldung zustande kommt?

mfg Nogge
  Mit Zitat antworten Zitat
Nogge

Registriert seit: 15. Jul 2004
336 Beiträge
 
Delphi 7 Professional
 
#2

Re: "Ungültiges Fensterhandle (Code 1400)" wegen i

  Alt 28. Okt 2006, 09:11
Ich habe jetzt alles mögliche versucht, jedoch finde ich leider diesmal nicht selbst die Lösung Wenn ich meinen FTP-Server nicht sofort aktivieren lassen (=Autostart), so dass die Form erst mal angezeigt wird, kommt während der gesamten Laufzeit keine Fehlermeldung mehr. Indy muss irgendwie in die Fensterverwaltung eingreifen, wenn der FTP-Server aktiviert wird. Das hört sich für mich auch total absurd an, aber ich finde leider keinen Bug in meinem Programm.
Oder bewirkt
Application.ShowMainForm := false; mehr, als es soll?
  Mit Zitat antworten Zitat
Nogge

Registriert seit: 15. Jul 2004
336 Beiträge
 
Delphi 7 Professional
 
#3

Re: "Ungültiges Fensterhandle (Code 1400)" wegen i

  Alt 28. Okt 2006, 19:47
Göttliche Eingebung!
In habe schon vor geraumer Zeit gelesen, dass Indy v10 pro Client mehr als nur einen Thread zum Empfangen von Daten verwendet (ACHTUNG: Die damaligen IdPeerThreads gibt es nicht mehr!). So stammen die Events (Hinweis: Events sind asynchron, obgleich sie eine Procedure der Mainform sind!) OnUserLogin und OnConnect aus 2 verschiedenen Threads, obwohl beide zu demselben Client gehören. Diese können also unabhängig voneinander und vom MainThread selbst aufgerufen werden.
In jedem Thread wurde diese Procedure ausgeführt:
Delphi-Quellcode:
procedure TF_Server.Log(const s: string);
begin
  LB_Log.Items.Add(s);
  SendMessage(LB_Log.Handle, WM_VSCROLL, SB_LINEDOWN, 0);
end;
Bevor die MainForm nicht mind. einmal vor dem Benutzen dieser Procedure angezeigt wurde, verursachten die beiden Zeilen sofort oder erst beim Beenden des gesamten Programms die o.g. Fehlermeldung.
Nachdem ich die beiden Zeilen mithilfe einer eigenen Message nun wirklich im MainThread ausführen lassen, d.h. synchronisiere, funktioniert alles ohne Fehlermeldung.
Delphi-Quellcode:
procedure TF_Server.proc_WM_LOG(var Msg: TMessage);
var
  StrP: PString;
begin
  StrP := PString(Msg.WParam);
  try
    LB_Log.Items.Add(StrP^);
    SendMessage(LB_Log.Handle, WM_VSCROLL, SB_LINEDOWN, 0);
  finally
    Dispose(StrP);
  end;
end;

procedure TF_Server.Log(const s: string);
var
  StrP: PString;
begin
  New(StrP);
  StrP^ := s;
  SendMessage(self.Handle, WM_LOG, Integer(StrP), 0); // Length(s)
end;
Wieso dieser Fehler nur dann auftritt, wenn ich die Form noch nie angezeigt habe, verstehe ich nicht so ganz. Vllt kann mir das ja noch mal jemand erklären, aber für's erste bin ich wieder glücklich

Gruß Nogge
  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 16:53 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