Probleme mit IStorage



  • Hi Leute,

    ich möchte einige Programmeinstellungen persistent machen und verwende dazu eine Compound-File (Storage).

    Diese Datei wurde mittels StgCreateDocFile (OLE2.dll) erzeugt.
    Mittel StgOpenStorage() wird bei Programmbeginn ein InterfacePointer auf IStorage zu dem File gesetzt: pIStorage. Der IO klappt auch, mit einem Haken:

    Mit IStorage->CreateStream() wird ein Stream erzeugt, z.B.: "ServerIP" und dort eine IP abgelegt, z.B: "127.0.0.1"

    Gespeichert wird aber tatsächlich nur: 127. also 4 Bytes 😞 Rufe ich mit einem HexViewer das File auf, sind darin auch tatsächlich nur die 127. gespeichert. Auch mit anderen Streams das Gleiche: Es werden nur vier Bytes gespeichert. Es muss also an der Routine liegen, die die Streams erzeugt und die Daten speichert, die sieht so aus:

    char           *bufferIp[18];
    IStream        *pIStream;
    HRESULT        hr;
    ULARGE_INTEGER ins;
    
    if(pIStorage) {
       hr = pIStorage->CreateStream(L"ServerIP",
                          STGM_CREATE | STGM_READWRITE | STGM_SHARE_EXCLUSIVE,
                          0, 0, &pIStream);
       if(hr == S_OK) {
          ins.QuadPart = 18;
          pIStream->SetSize(ins);
          hr = pIStream->Write(bufferIP, sizeof(bufferIP), NULL);
          pIStream->Release();
       }
    }
    

    bufferIP ist geprüft: Enthält String, sizeof returned die korrekte Zahl. Auch den
    Rückgabewert von Write habe ich geprüft: Der ist 4 ???? Der ist einfach
    immer nur 4.

    What's wrong 🙄



  • bufferIP ist ein zeiger
    sizeof(zeiger) = 4 ! 32Bit OS vorausgesetzt



  • sizeof(bufferIP)

    gibt 17 zurück, weil *bufferIP mit *bufferIP[18] initialisiert ist. Den \0 bekomme ich Gott sei Dank nicht mit als Result geliefert.

    Diese Deklaration entspricht:
    bufferIP = new char[18];

    nur sie läuft auf einem ziemlich lokalen Heap.

    Dennoch danke Man ... 😉

    Die Lösung kann ich immer noch nicht ganz genau nachvollziehen. Aber es funktioniert jetzt, und das ist das wichtigste.

    Das Problem war in meinen Fall tatsächlich das pIStream->Write() und dann
    anschließend das Pendant: pIStream->Read()

    Das genaue Problem liegt in beiden innerhalb der Klammern, nämlich:

    ULONG pcbRead als letzter Parameter.

    Ich stetzte hier ein

    ULONG comByteback;

    Statts dann NULL habe ich den Resultwert wissen wollen und setzte den Pointer darauf im letzten Parameter an, also fragte ich: &comByteback);
    Da ULONG eben vier Byte ist, bekam ich auch vier Bytes ;(((

    seit ich überall nun NULL einsetze funkt es 😉

    Und letztendlich:

    Typisch Noob! Die Storage hat so reagiert, wie ich sie programmierte. Aber ich
    habe in den Details dieses einfach nicht mehr gesehen 😉 Ich habe immer
    darauf losgeschmiedet - ohne auf die arme Storage zu gucken 🤡


Anmelden zum Antworten