Probleme beim Lesen von IStream



  • 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.


Anmelden zum Antworten