Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (http://www.delphipraxis.net/forum.php)
-   Netzwerke (http://www.delphipraxis.net/14-netzwerke/)
-   -   Indy TCP Client Exception (http://www.delphipraxis.net/168010-indy-tcp-client-exception.html)

hesch21 30. Apr 2012 12:10

Indy TCP Client Exception
 
Hallo allerseits

ich stehe wieder mal wie der Esel am Berg. Ich habe folgende ziemlich einfache Unit:
Code:
unit Client1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  StdCtrls, WinSock, IdCustomTCPServer, IdTCPServer;

type
    TALiz = class(TForm)
    TCPClient : TIdTCPClient;

    function GetLizfromServer(SW: String; Liz: String; PKey: String; IP: String): string;
end;

var ALiz: TALiz;

implementation

{$R *.dfm}

uses ping;

function TALiz.GetLizfromServer(SW: String; Liz: String; PKey: String; IP: String): string;
var Puffer : string;
var VErr  : Boolean;
var QIP   : in_addr;
begin
  if GetIPByName('www.schneider-it-gmbh.dyndns.org',QIP) then
     begin
     TCPClient.Host := inet_ntoa(QIP);
     Result    := '';
     VErr      := False;
     try
       TCPClient.Connect;
       Puffer := SW + '#' + PKey + '#' + Liz + '#' + IP;
       if TCPClient.Connected then
          begin
          TCPClient.GetResponse(100);
          if TCPClient.LastCmdResult.Text.Strings[0] = 'Server ready' then
             begin
             TCPClient.SendCmd(Puffer, 200);
             Puffer := TCPClient.LastCmdResult.Text.Strings[0];
             if copy(Puffer,1,4) <> 'NOGO' then
                Result := Puffer
             else
                begin
                ......
                end;
             end
          else
             Result := 'Verbindungsfehler 3';
          end;
       TCPClient.IOHandler.Close;
       TCPClient.Disconnect;
     except
       Result := 'Verbindungsfehler 1';
     end;
     end
  else
     Result := 'DNS-Fehler!';
end;

end.
Auf dem Form ist bloss ein TIdTCPCLient. Die Unit habe ich elf Applikationen eingebunden und funktioniert einwandfrei. Bei einer weiteren Applikation bekomme ich aber auf dem TCPClient.Host := inet_ntoa(QIP);
konstant eine Access Violation Exception. Und an der IP-Ermittlung liegt es nicht: Auch so etwas führt zum Fehler: TCPClient.Host := '192.168.0.11'.

Hat irgend jemand eine Idee, weshalb das 11 mal funktioniert, resp. was die Ursache sein könnte, weshalb es beim 12. mal nicht funktioniert?

Danke für Eure Hinweise

DataCool 30. Apr 2012 17:27

AW: Indy TCP Client Exception
 
@hesch21:
Hast Du die Möglichkeit das Auftreten der Exception zu debuggen ?
Es würde schon einiges weiterhelfen zu wissen an welcher Stelle(Zeile) der Fehler auftritt.

Greetz Data

sx2008 30. Apr 2012 18:07

AW: Indy TCP Client Exception
 
Delphi-Quellcode:
function TALiz.GetLizfromServer(SW: String; Liz: String; PKey: String; IP: String): string;
...
begin
  // Sicherheitsprüfungen
  Assert(Assigned(self), 'kein TALiz - Objekt');
  Assert(Assigned(self.TCPClient), 'kein TCPClient - Objekt');
Setze mal die Asserts in deinen code und nicht vergessen in den Projektoptionen die Asserts zu aktivieren.

hesch21 2. Mai 2012 10:16

AW: Indy TCP Client Exception
 
Vorab Danke für Eure Antworten.
@ Data: Ich glaube, ich habe ziemlich klar beschrieben, auf welcher Zeile mit welcher Exception das Programm aussteigt.
@ sx2008: Wenn ich die beiden Asserts einbaue, bekomme ich die Exception auf dem ersten Assert. Hier der exakte Text aus dem MAD-Bugreport:
exception class : EAssertionFailed
exception message : kein TALiz - Objekt (S:\Client1.pas, Zeile 30).
Aber was das nun bedeutet, resp. weshalb das TALiz-Objekt nicht vorhanden (assigned) ist, ist mir nach wie vor ein Rätsel.

DataCool 2. Mai 2012 10:29

AW: Indy TCP Client Exception
 
Zitat:

@ Data: Ich glaube, ich habe ziemlich klar beschrieben, auf welcher Zeile mit welcher Exception das Programm aussteigt.
Ja, da hast Du absolut Recht; Asche auf mein Haupt ... wer Lesen kann ist klar im Vorteil :wink:

Zitat:

Hast Du die Möglichkeit das Auftreten der Exception zu debuggen ?
Diese Frage halte ich aber schon für berechtigt, denn wenn ja dann müßtest Du auch herausfinden können,
warum Dein
TALiz-Objekt nicht vorhanden (assigned) ist.

Wird die function GetLizfromServer etwa von irgendwelchen Timern / Form-Events aufgerufen,
so das diese eventuell eintreten könnten, bevor Dein Objekt erzeugt ist ?

Greetz Data

hesch21 2. Mai 2012 12:00

AW: Indy TCP Client Exception
 
Hallo DataCool

natürlich läuft das Ding mit dem Debugger. Mal kurz um was es geht. Die Unit übermittelt dem (meinem) Server Lizenzierungsdaten welche dieser prüft. Je nach Ergebnis kommt vom Server ein Lizenzierungsschlüssel oder ein 'No Go' mit einem Fehlercode zurück. Angestossen wird das im Hauptprogramm über einen Button (also keinen Automatismus über einen Timer oder so). Der Fehler tritt erst auf, wenn ich die Funktion im Hauptprogramm über den Button aufrufe.

Die Aufruf-Procedure im Hauptprogramm ist auch recht einfach:
Code:
{Get License from Server}
procedure TComCont.BitBtn1Click(Sender: TObject);
var hili : string;
begin
  if Edit4.Visible and (Edit4.Text <> '') then
     hili := Edit4.Text
  else
     hili   := Label49.Caption;
  Edit3.Text := ALiz.GetLizfromServer('6', hili, Label48.Caption, 'IP');
  if StrToIntDef(copy(Edit3.Text,1,3),0) <> 0 then
     Button8Click(Self)
  else
     begin
     Edit3.Color := clRed;
     ShowMessage('There happened an error. Please consult the manual and try with a manual licensing');
     end;
end;
Wie bereits erwähnt, das ganze funktioniert in 11 anderen Applikationen problemlos mit derselben Unit.

DataCool 11. Mai 2012 23:00

AW: Indy TCP Client Exception
 
Hallo Hesch21,

wenn du hier :
Delphi-Quellcode:
  Edit3.Text := ALiz.GetLizfromServer('6', hili, Label48.Caption, 'IP');

Einen Breakpoint setzt, ist an der stelle ALiz eventuell = nil ?

Greetz Data

hesch21 14. Mai 2012 08:29

AW: Indy TCP Client Exception
 
Hallo Data

Deine Vermutung trifft zu. Aliz ist tatsächlich nil. Jetzt sollte ich bloss noch dahinter kommen, weshalb.

DataCool 15. Mai 2012 23:09

AW: Indy TCP Client Exception
 
Hi Hesch21,

sorry für die späte Antwort, ich war auf den Delphi Developer Days in Frankfurt ...
Zu Deinem Problem, es gibt eigentlich nur 3 Möglichkeiten/Ursachen das ALiz = nil ist:
- ALiz wird nirgendswo erzeugt ( ALiz := TALiz.Create ) Wenn aLiz erzeugt wird, in welcher Unit ?
- Die Variable aLiz ist 2 x deklariert, einmal in Deiner Unit und noch in einer anderen unit/Form wo
das Create der Klasse aufgerufen wird? In dem Fall wäre die var in Deiner Unit nämlich nil.
- Letzte recht unwahrscheinliche Möglichkeit, irgendwo außerhalb Deiner unit wiird ALiz := nil gesetzt.

Hoffe das hilft jetzt ;-)

Greetz Data

hesch21 16. Mai 2012 11:05

AW: Indy TCP Client Exception
 
Hallo Data

das war die Erleuchtung! Aus unerfindlichen Gründen hat mir Delphi 7 den Create für das Formular nicht in die DPR eingestellt, als ich die Unit über 'dem Projekt hinzügen' eingebunden haben. Das klappt sonst immer.
Wie dem auch sei, dort ein Application.CreateForm(TALiz, ALiz); einfügen hat geholfen.

Danke für deine Hilfe.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:32 Uhr.
Seite 1 von 2  1 2   

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