Probleme beim Lesen von IStream



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

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


Anmelden zum Antworten