AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Indy TCP Client Exception

Ein Thema von hesch21 · begonnen am 30. Apr 2012 · letzter Beitrag vom 16. Mai 2012
Antwort Antwort
Seite 1 von 2  1 2      
hesch21

Registriert seit: 31. Aug 2004
Ort: Basel
114 Beiträge
 
Delphi XE2 Enterprise
 
#1

Indy TCP Client Exception

  Alt 30. Apr 2012, 12:10
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
Heinz Schneider
  Mit Zitat antworten Zitat
Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
909 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Indy TCP Client Exception

  Alt 30. Apr 2012, 17:27
@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
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#3

AW: Indy TCP Client Exception

  Alt 30. Apr 2012, 18:07
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.
  Mit Zitat antworten Zitat
hesch21

Registriert seit: 31. Aug 2004
Ort: Basel
114 Beiträge
 
Delphi XE2 Enterprise
 
#4

AW: Indy TCP Client Exception

  Alt 2. Mai 2012, 10:16
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.
Heinz Schneider
  Mit Zitat antworten Zitat
Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
909 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Indy TCP Client Exception

  Alt 2. Mai 2012, 10:29
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

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
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat
hesch21

Registriert seit: 31. Aug 2004
Ort: Basel
114 Beiträge
 
Delphi XE2 Enterprise
 
#6

AW: Indy TCP Client Exception

  Alt 2. Mai 2012, 12:00
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.
Heinz Schneider
  Mit Zitat antworten Zitat
Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
909 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Indy TCP Client Exception

  Alt 11. Mai 2012, 23:00
Hallo Hesch21,

wenn du hier :
  Edit3.Text := ALiz.GetLizfromServer('6', hili, Label48.Caption, 'IP');
Einen Breakpoint setzt, ist an der stelle ALiz eventuell = nil ?

Greetz Data
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat
hesch21

Registriert seit: 31. Aug 2004
Ort: Basel
114 Beiträge
 
Delphi XE2 Enterprise
 
#8

AW: Indy TCP Client Exception

  Alt 14. Mai 2012, 08:29
Hallo Data

Deine Vermutung trifft zu. Aliz ist tatsächlich nil. Jetzt sollte ich bloss noch dahinter kommen, weshalb.
Heinz Schneider
  Mit Zitat antworten Zitat
Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
909 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: Indy TCP Client Exception

  Alt 15. Mai 2012, 23:09
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
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat
hesch21

Registriert seit: 31. Aug 2004
Ort: Basel
114 Beiträge
 
Delphi XE2 Enterprise
 
#10

AW: Indy TCP Client Exception

  Alt 16. Mai 2012, 11:05
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.
Heinz Schneider
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 00:07 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