Probleme beim Lesen von IStream
-
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.