Probleme beim Lesen von IStream
-
Hallo zusammen,
in einem Programm bekomme ich nach dem Ablauf eines Verfahrens einen Zeiger zurück vom Typ IStream.
Bis dahin läuft alles ok ist(auch getestet).jetzt will ich den IStream lesen das geht aber schief :
Dataobject ss;
IStream *is = NULL;
is = ss.getMyData();
//Bis hier alles ok
string *sbuff;
sbuff = NULL;
sbuff = new string();ULONG cb = 1024;
ULONG *pcbRead = NULL;
ULONG var = 0;
pcbRead = &var;
//hier fängt das übel an

is->Read(sbuff,cb,pcbRead);Danach ist sbuff == NULL und die Variable pcRead soll die anzahl der gelesenen Bytes beinhalten. Ist aber 0.
Hat jemand Erfahrung mit IStream ? ich will die Daten aus dem Stream als String vorliegen haben weil die anschließend über ein Sockel versendet wirden.
Für Beispiele wäre ich sehr dankbar.
Oder Vieleicht eine bessere Idee wie ich den IStream über Sockets versenden kann.
Die Sache soll schon auf einer Windows kiste laufen :p aber kein .NET oder sowas nur WINAPI und Standart.
Vielen Dank im Voraus
bis dann
-
hast du schonmal versucht im WinAPI-Forum zu fragen?
da wärst du sicher besser aufgehoben

-
es must nicht Win API sein es darf, nur .NET ist ein "nogo".
-
daarko schrieb:
in einem Programm bekomme ich nach dem Ablauf eines Verfahrens einen Zeiger zurück vom Typ IStream.
Die Sache soll schon auf einer Windows kiste laufen :p aber kein .NET oder sowas nur WINAPI und stan****.
Was bitte ist ein IStream?
In ANSI C++ gibt es wenn nur die Klasse istream (klein geschrieben), nach suche in der MSDN würde ich darauf tippen das IStream vermutlich COM ist. Mit Standard C++ ist daher eh nichts zu machen, wenn benötigst du ohnehin mindestens die Windows API. Daher falsches Forum (es gibt ein WindowsAPI-Unterforum, und vermutlich wirst du verschoben).
Zu Dataobject habe ich wiederum auf Anhieb nur die Schreibweise DataObject gefunden, letzteres wäre aber .Net Framework.
cu André
-
Hallo zusammen,
ja Sorry Ihr habt recht, wenn möglich bitte verschieben.
Also Istream das "I" groß.nicht "istream". ja das kommt aus der COM
habe aber leider auch mit der COM keine Erfahrung, vieleicht weist jemand
das was genaues ?Mit dem IStream würde mir ein Beispiel genügen.
Vielen Dank euch.
Gruß Darko
-
PS: ich habe auch schon die MSDN durchwühlt und auch gegoogelt leider keine entsprechenden Beispiele.
-
char buffer[1024]; ULONG numberOfBytesRead; is->Read(buffer, sizeof(buffer), &numberOfBytesRead);
-
Hallo,
Vielen Dank für die Antworten.
//funktioniert nicht
......... schrieb:
char buffer[1024]; ULONG numberOfBytesRead; is->Read(buffer, sizeof(buffer), &numberOfBytesRead);Mein Code:
char buffer[1024000];
ULONG numberOfBytesRead;
HRESULT hr;
hr = is->Read(buffer,sizeof(buffer),&numberOfBytesRead);
if(hr==S_OK)
cout << "HRESULT war : S_OK " << "\n";
if(hr==S_FALSE)
cout << "HRESULT war : S_FALSE " << "\n";
if(hr==E_PENDING)
cout << "HRESULT war : E_PENDING " << "\n";
if(hr==STG_E_ACCESSDENIED)
cout << "HRESULT war : STG_E_ACCESDENIED " << "\n";
if(hr==STG_E_INVALIDPOINTER)
cout << "HRESULT war : STG_E_INVALIDPOINTER " << "\n";
if(hr==STG_E_REVERTED)
cout << "HRESULT war : STG_E_REVERTED " << "\n";
-----------------------------------------------------------------------
Es kommt raus :
HRESULT war : S_OK
aber numberOfBytesRead = 0
eigentlich müsste das genau so laufen macht er aber nicht.
Der Zeiger is ist auf jeden fall ok sieht man auch an HRESULT war : S_OKvieleicht weist jemand noch eine Möglichkeit oder sieht den Fehler.
vielen Dank
-
Wer schreibt denn in den Stream?
-
Die main methode, aus einer Klasse rufe ich eine Methode auf die einen zeiger auf IStream zurückt gibt hier "is". der is zeiger ist aufjeden fall ok.(Getestet).
-
Dann zeig mal wie du Write aufrufst.
-
schrieb:
Dann zeig mal wie du Write aufrufst.
gar nicht, im stream wird ein Bitmap gespeichert.
die Methode in der Klasse :
.....
.....
..
IStream *speicher;
......
......Bitmap *bitmap = Bitmap:: ................
bitmap->Save(speicher,....);
return speicher;
-----------------------
Das läuft alles automatisch in der Klasse, die Methode gibt mir nur einen zeiger auf ein IStream zurück.IStream *is = meinObject.GetBitmap();
wie schon gesagt der "is" ist ok das geht auch alles glad.
nur jetzt will ich aus dem IStream lesen, und da ist das Problem
is->Read(........);
Ich vermute dass die Parameter von Read falsch sind.
-
Wird zwischen
IStream *speicher;
und
bitmap->Save(speicher,....);
noch irgendwas mit "speicher" gemacht? Wenn nicht ist es ja wohl sehr klar das es nicht funktioniert.

-
Ja natürlich :
.....
.....
.....//Speicher für IStream allocieren
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE,1024);
CreateStreamOnHGLOBAL(hGlobal,TRUE,&is);
.....
....und dann bitmap->Save(is,.....);
-
sorry name verwechselt
an dieser stelle heist der IStream nicht "is" sondern "speicher".
also IStream *speicher.
-
Hier findest du ein funktionierendes Beispiel: http://www.codeproject.com/KB/GDI-plus/MemImage.aspx
Mit dessen Hilfe müsstest du doch eigentlich den Fehler finden können.
-
So habs mir selbst mal angeguckt, ich denke mal in deinem Code fehlt der Seek-Aufruf mit dem man an den Anfang springt.
-
Genau das war das Problem : "Seek" fehlt bei mir.

also so wird aus einem IStream gelesen.
//ich bekomme einen Zeiger auf einen IStream von einer methode
IStrem* is = myobejct.getDataIStream();Variablen für die Größe definiern :
ULARGE_INTEGER size;
LARGE_INTEGER myoffset;
myoffset.QuadPart = 0;//JETZT WICHTIG mit Seek die Pointer setzen! Mein Hauptproblem!
//größe bestimmen
is->Seek(myoffset,STREAM_SEEK_END,&size);
//und jetzt wieder an den Anfang springen
is->Seek(myoffset,STREAM_SEEK_SET,NULL);//Char Array erzeugen mit entsprechender Größe
char *mybuffer = new char[size.QuadPart];//Aus dem Stream lesen
ULONG readBytes;
is->Read(mybuffer,size.QuadPart,&readBytes);:p :p :p
Vielen Dank für die Hilfe.
Danke für den Link.