Probleme mit TMemoryStream
-
Hallo Leute,
also ich bin hier langsam am verzweifeln.
Ich möchte einfach eine Datei über die TClientSocket Komponente
senden. Nun hab ich eine Klasse die meine Verbindung handelt.
Ich erstelle also einen TMemoryStream lade eine bestimmte
Datei und sende diese an den Server.Alles klappt ja auch wunderbar, die Datei kommt ja auch an
ABER ich bekomme einen "Access Violation" an der Stelle:delete stream_send
.
Hier mein ganzer Quellcode:
if(OpenDialog1->Execute()) { TMemoryStream *stream_send = new TMemoryStream(); stream_send->LoadFromFile(OpenDialog1->FileName); comm->client->Socket->SendStream(stream_send); delete stream_send; }
Alles funktionierrt perfekt wenn man das
delete stream_send
.
einfach weglässt.
-
Vorher den Socket schliessen?
-
Hi Jansen,
hab jetzt folgende Zeile hinzugefügt:
comm->client->Socket->Disconnect(0);
um den Socket wieder zu schließen.
Leider kommt die Exception immer noch.
-
Oh!
Mir ist grad noch was aufgefallen.
Anscheinend stimmt was nicht mit dem Objekt!Wenn ich versuche den Inhalt zu speichern:
stream_send->SaveToFile("C:\\sendingstream");
dann bekomme ich auch eine Exception.
Oh man! Was ist da los?! Wieso kann ich nicht auf meinen Stream
zugreifen?
-
Das gibts doch nicht!
Und wenn ich folgendes Versuche:
if(OpenDialog1->Execute()) { TMemoryStream *stream_send = new TMemoryStream(); stream_send->LoadFromFile(OpenDialog1->FileName); stream_send->SaveToFile("C:\\sendingstream"); comm->client->Socket->SendStream(stream_send); // delete stream_send; }
dann klappt es. Wie kann das sein? Wird mein Stream nach dem Senden
automatisch gelöscht oder wie darf ich das verstehen?
Das kann aber auch nicht sein, denn wenn ich noch mal
was sende werden diese Daten den vorangegangenen angehangen.Also ich bin total überfragt, so ein Mist!
-
Schade, anscheinend weiß keiner weiter.
Naja, also ich hab mich jetzt auf die Indy Komponenten
umgeworfen. Was soll ich sagen... alles läuft perfekt!Gruß!
-
Surbuble schrieb:
Wird mein Stream nach dem Senden
automatisch gelöscht oder wie darf ich das verstehen?Ja:
C++Builder 6-Dokumentation schrieb:
TCustomWinSocket::SendStream
Die Methode SendStream schreibt alle Informationen, die aus dem im Parameter AStream angegebenen Stream gelesen werden können, in die Socket-Verbindung.
bool __fastcall SendStream(Classes::TStream* AStream);
...
Hinweis
Eigentümer des Stream, der als Parameter an SendStream übergeben wird, wird das Windows-Socket-Objekt. Das Windows-Socket-Objekt gibt den Stream nach erfolgter Verarbeitung frei. Versuchen Sie nicht, den Stream, nachdem er als Parameter übergeben wurde, freizugeben.
-
Hi audacia,
danke schön. Das erklärt natürlich warum ich solche Probleme
damit hatte.Jetzt hab ichs auch gesehen:
Note: The Stream passed as a parameter to SendStream becomes “owned” by the windows socket object. The Windows socket object frees the stream when it is finished with it. Do not attempt to free the stream after it has been passed as a parameter.
Naja, so ist das wenn man im stress ist.
Nochmal vielen Dank!