Probleme beim Lesen von IStream



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