Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi IdIRC.Free flasch? (https://www.delphipraxis.net/146603-idirc-free-flasch.html)

DelTurbo 23. Jan 2010 14:31


IdIRC.Free flasch?
 
Hi,

ich erstelle zur laufzeit mehrere IdIRC´s. Nun möchte ich natürlich auch Disconnecten können. Hier mal ein code-snipsel...

Delphi-Quellcode:
IrcServer[i].Timer1.Enabled:=False;
IrcServer[i].Timer1.Free;
IrcServer[i].Timer2.Enabled:=False;
IrcServer[i].Timer2.Free;
IrcServer[i].IdIrc.Disconnect('ATDisconnect');
IrcServer[i].IdIrc.IOHandler.Close;
IrcServer[i].IdIrc.Free;
Bei dem .Free bekomm ich immer eine zugriffs verletzung. Ist das nicht richtig mit .Free? Bei den Timern geht das. Ich bin da nun etwas verwirrt.

Danke im voraus

DelTurbo 23. Jan 2010 15:56

Re: IdIRC.Free flasch?
 
Bin grad quasi drüber gefallen.

IrcServer[i].IdIrc.IOHandler.Close;
IrcServer[i].IdIrc.IOHandler.Free;
IrcServer[i].IdIrc.Free;

Dann geht es. :gruebel:

Assertor 27. Jan 2010 23:41

Re: IdIRC.Free flasch?
 
Hi,

Zitat:

Zitat von DelTurbo
Bin grad quasi drüber gefallen.

IrcServer[i].IdIrc.IOHandler.Close;
IrcServer[i].IdIrc.IOHandler.Free;
IrcServer[i].IdIrc.Free;

Dann geht es. :gruebel:

Warum machst Du ein IOHandler.Close? Bekommst Du denn eine Fehlermeldung wenn Du nur IdIRC.Free aufrufst?

Gruß Assertor

Edit: Hab gerade Deine PN gesehen. Es geht also darum, dass eine AV Auftritt, wenn Du nicht .Close aufrufst. Ich prüf das mal ab.

DelTurbo 28. Jan 2010 10:35

Re: IdIRC.Free flasch?
 
Zitat:

Zitat von Assertor
Edit: Hab gerade Deine PN gesehen. Es geht also darum, dass eine AV Auftritt, wenn Du nicht .Close aufrufst. Ich prüf das mal ab.

Danke

Assertor 28. Jan 2010 10:38

Re: IdIRC.Free flasch?
 
Hi DelTurbo,

ich hab das jetzt bestimmt 50x geprüft und bekomme keine AV. Indy ist bei Dir ja die letzte aus dem SVN, ansonsten bitte dazuschreiben.

Edit: Das Close ist natürlich drin: Destruktorreihenfolge IdIRC.Destroy > IdCmdTCPClient.Destroy > IdTCPConnection.Destroy:

Delphi-Quellcode:
destructor TIdTCPConnection.Destroy;
begin
  // Just close IOHandler directly. Dont call Disconnect - Disconnect may be override and
  // try to read/write to the socket.
  if Assigned(IOHandler) then begin
    IOHandler.Close;
    // This will free any managed IOHandlers
    IOHandler := nil;
  end;
  ...
end;
Welche Delphi Version setzt Du ein?

Gruß Assertor

DelTurbo 28. Jan 2010 10:45

Re: IdIRC.Free flasch?
 
Delphi 7 und SVN Version 402? weiss nicht genau. Aber die wo alle IdIRC sachen gefixt wurden.

Gruss

DelTurbo 28. Jan 2010 10:50

Re: IdIRC.Free flasch?
 
Ui, stopp. Nun kommen wir durcheinander. Auf jeden fall ich. Es sind 2 verschiedene sachen. Das aus der PN hat nix mit dieser sache hier zu tun.

Dort "liegt" der idirc ja schon in der Form1. Hier geht es darum, wenn der IdIRC zur laufzeit erstellt wurde. Sonst bräuchte ich ja kein free machen :zwinker:

Assertor 28. Jan 2010 11:15

Re: IdIRC.Free flasch?
 
Hallo,

Zitat:

Zitat von DelTurbo
Ui, stopp. Nun kommen wir durcheinander. Auf jeden fall ich. Es sind 2 verschiedene sachen. Das aus der PN hat nix mit dieser sache hier zu tun.

Dort "liegt" der idirc ja schon in der Form1. Hier geht es darum, wenn der IdIRC zur laufzeit erstellt wurde. Sonst bräuchte ich ja kein free machen :zwinker:

Gut, ist ja auch egal. Das Close ist trotzdem unnötig, da es intern schon gemacht wird. Einfach der Klassenvererbung der Destruktoren folgen.

Ich habe jetzt gerade die SVN Version mit dem IRC Fix (Rev 4017) und die aktuelle Version (Rev 4030) mit Delphi 7 PE Build 4.453 unter einem frischen Win XP SP3 x32 getestet: Keine Probleme - weder bei IdIRC auf der Form noch per Code erzeugt. Connect, FormClose und Connect, Disconnect, FormClose ausprobiert. Intern nutzt der TCP Client ja TThreads. Delphi 5, 6 und 7 sind nicht gerade gut was die TThread Klasse angeht, vielleicht ist das die Ursache?

Auf jeden Fall ist das leider "not reproducible". Es kann an anderen Komponenten, der exakten Delphi Version (Patch & Update Level?), Tools wie EurekaLog/madExcept oder sonstwas liegen. Ohne mehr Information kann ich da leider nichts machen... :glaskugel:

Gruß,

Assertor

Assertor 28. Jan 2010 11:23

Re: IdIRC.Free flasch?
 
Hi,

Kannst Du mal bitte die Fehlermeldung 1:1 hier posten? Kommt denn eine AV oder eine Exception? Beim Testen bitte das eigene IOHandler.Close weglassen...

Gruß,

Assertor

DelTurbo 28. Jan 2010 11:27

Re: IdIRC.Free flasch?
 
:gruebel: Wieso schreibst du hier was von close??? :gruebel:

Nochmal, die PN hat garnix hiermit zu tun. Bitte behandel PN einzeln und antworte mir auf die PN. Nicht hier im thread. Ich peil im moment wirklich nixmehr.

Zurück zu diesem Thread hier:
Für dieses beispiel hier ist close unerheblich. Es geht hier um einen per laufzeit erstellten und auch genutzen IdIRC. Wichtig, er muss einmal connecten. Sonst tritt der fehler nicht auf.

Zur laufzeit!!!
Erstellen und löschen geht.
Erstellen, Connecten und löschen geht nicht.

Die PN musst du bitte gesondert behandeln. Sonst kommen wir total durcheinander. Und das sind wir wohl schon :oops:

Gruss

Assertor 28. Jan 2010 11:40

Re: IdIRC.Free flasch?
 
Hallo,

Zitat:

Zitat von DelTurbo
:gruebel: Wieso schreibst du hier was von close??? :gruebel:

Nochmal, die PN hat garnix hiermit zu tun. Bitte behandel PN einzeln und antworte mir auf die PN. Nicht hier im thread. Ich peil im moment wirklich nixmehr.

:wall: Bitte lies Dir Deinen ersten Post im Thread hier nochmal durch:

Zitat:

Zitat von DelTurbo
ich erstelle zur laufzeit mehrere IdIRC´s. Nun möchte ich natürlich auch Disconnecten können. Hier mal ein code-snipsel...

Delphi-Quellcode:
IrcServer[i].Timer1.Enabled:=False;
IrcServer[i].Timer1.Free;
IrcServer[i].Timer2.Enabled:=False;
IrcServer[i].Timer2.Free;
IrcServer[i].IdIrc.Disconnect('ATDisconnect');
IrcServer[i].IdIrc.IOHandler.Close; // <- da ist es !!!
IrcServer[i].IdIrc.Free;

Zitat:

Zitat von DelTurbo
Zurück zu diesem Thread hier:
Für dieses beispiel hier ist close unerheblich. Es geht hier um einen per laufzeit erstellten und auch genutzen IdIRC. Wichtig, er muss einmal connecten. Sonst tritt der fehler nicht auf.

Zur laufzeit!!!
Erstellen und löschen geht.
Erstellen, Connecten und löschen geht nicht.

Die PN musst du bitte gesondert behandeln. Sonst kommen wir total durcheinander. Und das sind wir wohl schon :oops:

Das erst ein Connect gemacht werden soll, ist klar. Lies meine Antwort bitte nochmal, dort steht was ich beim Testen mache: Connect, FormClose und Connect, Disconnect, FormClose.

Und ich habe eben beides geprüft: Zur Laufzeit erstellt (by Code) und über die Form auch.

Zitat:

Zitat von DelTurbo
Bei dem .Free bekomm ich immer eine zugriffs verletzung. Ist das nicht richtig mit .Free? Bei den Timern geht das. Ich bin da nun etwas verwirrt.

Doch, Free ist richtig. Und dabei bekomme ich keine Zugriffsverletzung, mit oder ohne Disconnect vor dem Free... Das wundert mich ja.

Gruß Assertor

DelTurbo 28. Jan 2010 12:05

Re: IdIRC.Free flasch?
 
Zitat:

Zitat von Assertor
Doch, Free ist richtig. Und dabei bekomme ich keine Zugriffsverletzung, mit oder ohne Disconnect vor dem Free... Das wundert mich ja.

Das muss ich aber nun auch nicht wirklich verstehen, wenn du schon nicht weisst was das ist. Aber es ist wirklich fakt das wenn ich das IOHandler.Free weglasse, es nicht geht. Ich mach den Thread ja nicht aus langeweile auf. ;)

Auch schicke ich dir nicht aus langeweile PNs mit anhang. :-D

Und ich habe das ja nicht nur unter XP gestestet. Auch unter 2k.

Ich würde vorschlagen das wir das hier nun erstmal "ruhen" lassen bis ich dir eine "demo" schicken kann. Sonst suchst du dir nen ast, und das muss nicht sein.

Ich habe es grade mal ohne .Close und ohne .Free versucht.

Zitat:

Zugriffsverletzung bei Adresse 00492999 in Modul 'mymirc.exe'. Lesen von Adresse 00000094.
Mach ich das .Free wieder rein, geht es. Das .Close war noch vom testen über. Das hab ich garnichtmehr wahrgenommen bzw mit der PN verwechselt. :oops:

Gruss

Assertor 28. Jan 2010 14:01

Re: IdIRC.Free flasch?
 
Hallo,

Zitat:

Zitat von DelTurbo
Zitat:

Zitat von Assertor
Doch, Free ist richtig. Und dabei bekomme ich keine Zugriffsverletzung, mit oder ohne Disconnect vor dem Free... Das wundert mich ja.

Das muss ich aber nun auch nicht wirklich verstehen, wenn du schon nicht weisst was das ist. Aber es ist wirklich fakt das wenn ich das IOHandler.Free weglasse, es nicht geht. Ich mach den Thread ja nicht aus langeweile auf. ;)

Da der Fehler nur bei Dir auftritt, muß auch bei Dir debuggt werden. Bitte steppe mal durch IdIRC.Free durch, damit Du sagen kannst, wo und wann genau die AV kommt.

Zitat:

Zitat von DelTurbo
Und ich habe das ja nicht nur unter XP gestestet. Auch unter 2k.

Unerheblich, wird beides mit D7 erzeugt. Ich hab ja nicht gesagt, es ist OS-abhängig, sondern möglicherweise ein Fehler im Zusamenhang mit der TThread Klasse aus D7...

Gruß,

Assertor

DelTurbo 28. Jan 2010 14:30

Re: IdIRC.Free flasch?
 
Zitat:

Zitat von Assertor
Da der Fehler nur bei Dir auftritt, muß auch bei Dir debuggt werden. Bitte steppe mal durch IdIRC.Free durch, damit Du sagen kannst, wo und wann genau die AV kommt.

Du meinst doch sicher andersrum. Ich kann ja nicht durch das .Free steppen wenn es damit klappt.

Obwohl... könnte ich schon. Vertreibt langeweile :-D (kleiner scherz)

Gruss

Assertor 28. Jan 2010 14:37

Re: IdIRC.Free flasch?
 
Hallo,

Zitat:

Zitat von DelTurbo
Zitat:

Zitat von Assertor
Da der Fehler nur bei Dir auftritt, muß auch bei Dir debuggt werden. Bitte steppe mal durch IdIRC.Free durch, damit Du sagen kannst, wo und wann genau die AV kommt.

Du meinst doch sicher andersrum. Ich kann ja nicht durch das .Free steppen wenn es damit klappt.

Obwohl... könnte ich schon. Vertreibt langeweile :-D (kleiner scherz)

(lustig...) Spaß beiseite, nein ich meine Deinen Code. Du sagst Doch es gibt eine AV wenn Du dies und das wegläßt. Nun gut, laß dieses ganzen Kram weg und steppe durch das IdIRC.Free, da es dort doch knallt, oder?

Poste mal bitte etwas mehr Code, insbesondere da Du scheinbar eine Iteration über eine Liste von IdIRC Clients machst! Die niedrige AV deutet afaik darauf hin, das auf etwas schon freigegebenes zugegriffen wird.

Also: Code her!

DelTurbo 28. Jan 2010 14:43

Re: IdIRC.Free flasch?
 
Zitat:

Zitat von DelTurbo
Aber es ist wirklich fakt das wenn ich das IOHandler.Free weglasse, es nicht geht.

Damit meine ich, das es dann "knallt" wenn ich das .Free weglasse. Wenn es drin ist geht es.

Assertor 28. Jan 2010 14:50

Re: IdIRC.Free flasch?
 
Hi,

Zitat:

Zitat von DelTurbo
Zurück zu diesem Thread hier:
Für dieses beispiel hier ist close unerheblich. Es geht hier um einen per laufzeit erstellten und auch genutzen IdIRC. Wichtig, er muss einmal connecten. Sonst tritt der fehler nicht auf.

Zur laufzeit!!!
Erstellen und löschen geht.
Erstellen, Connecten und löschen geht nicht.

Poste Deinen Code :evil:

Damit meine ich nicht ein 3- oder 5-Zeilen Snippet, hellsehen kann ich nicht.

Ich wette langsam darauf, das zu 99,9% der Fehler in Deiner IdIRCServer-Klasse liegt (die nichts mit dem TIdIRCServer von Indy zu tun hat, richtig?).

Gruß,

Assertor

DelTurbo 28. Jan 2010 15:01

Re: IdIRC.Free flasch?
 
Zitat:

Zitat von DelTurbo
Ich würde vorschlagen das wir das hier nun erstmal "ruhen" lassen bis ich dir eine "demo" schicken kann. Sonst suchst du dir nen ast, und das muss nicht sein.

Ich habe es grade mal ohne .Close und ohne .Free versucht.

Zitat:

Zugriffsverletzung bei Adresse 00492999 in Modul 'mymirc.exe'. Lesen von Adresse 00000094.
Mach ich das .Free wieder rein, geht es. Das .Close war noch vom testen über. Das hab ich garnichtmehr wahrgenommen bzw mit der PN verwechselt. :oops:

Gruss

Ich würde mal sagen wir lassen es erstmal. Sorry das ich ein post verdreht habe. Ich mache dir wieder eine Demo wie beim fehler mit dem AltNickName und schick es dir. Das ist einfacher als alles andere.....

Gruss

Assertor 28. Jan 2010 15:07

Re: IdIRC.Free flasch?
 
Hallo,

Zitat:

Zitat von DelTurbo
Ich würde mal sagen wir lassen es erstmal. Sorry das ich ein post verdreht habe. Ich mache dir wieder eine Demo wie beim fehler mit dem AltNickName und schick es dir. Das ist einfacher als alles andere.....

Ok, dann halt so... Deinen Code zu zeigen (hier oder PN) würde das abkürzen, aber gut :gruebel:

Fürs Protokoll und spätere Leser: AltNickName war kein Fehler, sondern schlicht nie in Indy IdIRC implementiert. Das habe ich heute nachgeholt.

Gruß,

Assertor

DelTurbo 28. Jan 2010 15:45

Re: IdIRC.Free flasch?
 
Ne, ich mach dir wieder so eine "demo". Wie bei den anderen sachen auch. Das ist viel einfacher für dich. Dann kannst du das wieder direkt nachvollziehen. Weil bisher habe ich nur gute erfahrungen damit gemacht. Du (oder wer auch immer) konntest es ruckzuck fixen und gut war.

Ob das ctcp oder altnickname war, egal. Ging viel viel schneller als das hin und her. Wenn das nicht so wäre hätte ich ja nixmehr geschickt ;)

Du musst zugeben das wir nie sollange gebraucht haben. Da ich neben bei ja auchnoch was anderes mache, komme ich wie sicherlich gemerkt schonmal durcheinander. So kann ich abends in ruhe einen 3zeiler machen und dir schicken. Da kam noch nie eine rückfrage so wie hier.

Gruss und danke im voraus

Assertor 29. Jan 2010 13:17

Re: IdIRC.Free flasch?
 
Hallo,

DelTurbo hat mir nun eine Demo geschickt.

Das Ergebnis:
1. Seine D7 EXE hat den Fehler
2. Sein Projekt-Source bei mir mit einem frischen D7 und Indy Source kompiliert hat den Fehler nicht

Der Code funktioniert natürlich auch ohne IOHandler.Close und IOHandler.Free, bevor hier ein Leser auf die Idee kommt, selbst sowas zu machen:

Delphi-Quellcode:
IdIRC.Disconnect('Bye');
// IdIRC.IOHandler.Close; <- nicht nötig
// IdIRC.IOHandler.Free; <- nicht nötig
IdIRC.Free;
Im Ergebnis also ein laaaanger Thread für ein Problem, das keins ist. Zumindest kein Indy-Problem oder Bug ;)

Ich tippe auf alte DCUs irgendwo im Pfad, aber das muß DelTurbo nun selbst prüfen... Kann jedem Delphi-Neuling mal passieren. Also, alles halb so wild.

Gruß,
Assertor

:dp:

DelTurbo 29. Jan 2010 16:40

Re: IdIRC.Free flasch?
 
Zitat:

Zitat von Assertor
Im Ergebnis also ein laaaanger Thread für ein Problem, das keins ist. Zumindest kein Indy-Problem oder Bug ;)

Ich tippe auf alte DCUs irgendwo im Pfad, aber das muß DelTurbo nun selbst prüfen... Kann jedem Delphi-Neuling mal passieren. Also, alles halb so wild.

Deswegen schick ich dir immer lieber "Demos" als zu diskutieren. "Früher" habe ich ja selber durch getraced und dir dann die sachen (ich glaube sogar mit zeilennummer) geschickt.

Aber das hier ist ein sooooo blöder fehler, den kann man schlecht tracen. Wie besprochen werde ich am Wochenende mal Delphi neu auf nen anderen rechner machen und Indy neu draufpacken.

Öhm, ne fileliste was gelöscht werden muss gibt es wohl nicht, oder?

DelTurbo 31. Jan 2010 12:04

Re: IdIRC.Free flasch?
 
So,

ich habe Delphi auf einem "sauberen" System installiert. Meine vorgehens weise hänge ich unten dran. Fehler bleibt. Wenn ich ehrlich sein darf, es juckt mich nicht wirklich. Ich hab halt das .Free drinn und damit geht es. Wenn du noch eine andere idee hast, kannste es ja sagen.

Gruss

Zitat:

Upgrading to Indy 10
Delphi 7 ships with Indy 9. Since the only documentation on the Indy website is now based on release 10, and some examples won't work with older releases, you must remove Indy 9 from the IDE, and install release 10.

There are two possibilities, but both require your uninstalling Indy 9 yourself before installing Indy 10:

upgrade manually following thoses instructions: How do I install Indy into Borland Delphi?, Upgrading to Indy 10, [D7] Upgrade propre des composants Indy vers Indy 10.1.5?, [D7 Ent] How to upgrade Indy properly?, Indy 10 in Delphi 2006
run the upgrader Indy Plus Install, free for personal or educational users, while commercial projects require buying the Indy Plus package
Removing Indy9:
Close the Borland Delphi IDE if it is open.
If you are using the version of Indy included in Delphi 6 or 7, use the MSI installer to remove Indy: In "Program Files", click on the drop-down list before Indy, and select Do Not Install. If you didn't install Corba, uncheck "Use Visibrocker/CORBA Support" before proceeding with the uninstall
Remove all Indy files from the Delphi directory, including dclIndy*.bpl, Indy*.bpl, the Id*.pas, and the Id*.dcu's. Take care that you only remove the old Indy files and not something else. Be sure that you also remove any Indy*.bpl from your Windows\System32 directory (IndyCore70.bpl, IndyProtocols70.bpl, and IndySystem70.bpl)
When restarting Delphi, it will fail loading the Indy 9 BPL: "Error/Can't load package c:\program files\borland\delphi\Bin\dclindy70.bpl. The specified module could not be found. Do you want to attempt to load the package the next time a project is loaded?" Just tell it not to try reloading this package the next time.
Manually installing Indy10
Place the new version of Indy in a directory of your choice. When unzipping, please keep the \source directory for the archive intact because that is used by some build batch files.
In the source directory, there are several batch files. Run the appropriate one for your version of Indy:
FULLD4.BAT - Delphi 4
FULLD5.BAT - Delphi 5
FULLD6.BAT - Delphi 6
FULLD7.BAT - Delphi 7
These batch files create subdirectories in the main Indy directory folder. They are (D4 for Delphi 4, D5 for Delphi 5, D6 for Delphi 6, and D7 for Delphi 7). These directories contain:
The Indy .DCU's
The Indy Design-Time .BPL
In your Delphi IDE, add the Indy design-time package with Component|Install Package...|Add... Go to the subdirectory where the Indy .DCU's and Design-Time .BPL was placed by the batch file. Add the Design-Time .BPL that is listed. It usually is named dclIndy followed by the Borland Delphi version and an 0
Add the path where the .DCU's are located to your environment. Do this with Tools|Environment Options...|Library...|Library Path...
(Difference with above instructions?) Compiling and installing manually:

Note: All packages are followed by X0 (Where X is your Delphi verison). Example: For Delphi 6, the IndySystem package would be named: IndySystem60.dpk

Download the latest source code
Open and compile .dpk files in the following order:

Lib\System\IndySystemX0.dpk
Lib\Core\IndyCoreX0.dpk
Lib\Protocols\IndyProtocolsX0.dpk

Lib\SuperCore\IndySuperCoreX0.dpk
If you are not using SuperCore, then you do not need to compile this package.

Now open these .dpk files and click install in the following order:

Lib\Core\dclIndyCoreX0.dpk
Lib\Protocols\dcl\IndyProtocolsX0.dpk

Lib\SuperCore\dcl\SuperCoreX0.dpk
Only install this if you have compiled SuperCore.
After installing Indy 10, you might get the following error when adding a IdUDPServer widget and code for the UDPRead event: "[Error] Unit1.pas(15): Undeclared identifier: 'TBytes'"

=> "That is a known Delphi bug, not an Indy one. The bug is that Delphi parses the signature wrong when generating the event handler. As for why TIdBytes is used in the event, it is because the Intercept system in Indy 10 is based on TIdBytes to begin with. It Indy 9, it was based on Streams instead."

Quelle: http://www.fredshack.com/docs/indy.html

DelTurbo 31. Jan 2010 12:20

Re: IdIRC.Free flasch?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hänge das Testprogramm mal hier dran. Es sind 3 Buttons drauf.

Zuerst Erstellen connecten klicken. Dann connected er ins irc.iz-smart.net. Dann wahlweise Löschen mit .Free oder ohne .Free klicken.

Bei mir kommt bei ohne .Free

Zugriffsverletzung bei Adresse 004751DD in Modul 'Project1.exe'. Lesen von Adresse 00000094.

Gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:23 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