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