IStream – Összetett fájl implementálása
Az IStream felület támogatja az adatok olvasását és írását az objektumok streameléséhez. Strukturált tárolóobjektumokban a streamobjektumok tartalmazzák az adatokat, és a tárolók biztosítják a struktúrát. Az egyszerű adatok közvetlenül egy streambe írhatók, de gyakrabban a streamek egy tárolóobjektumba ágyazott elemek. Ezek hasonlóak a standard fájlokhoz.
Az IStream specifikációja több funkciót határoz meg, mint amennyit a COM-implementáció támogat. Az IStream interfész például legfeljebb 2⁶⁴ bájt hosszúságú streameket határoz meg, amelyekhez 64 bites keresési mutató szükséges. A COM-implementáció azonban csak legfeljebb 2³² bájt hosszúságú (4 GB) streameket támogat, és az olvasási és írási műveletek mindig 2³² bájtra korlátozódnak egyszerre. A COM-implementáció nem támogatja a streamtranzakciót vagy a régió zárolását.
Ha globális memórián alapuló egyszerű streamet szeretne létrehozni, egy IStream- mutatót kaphat az API-függvény meghívásával CreateStreamOnHGlobal. Ha összetett fájlobjektumon belül szeretne IStream mutatót lekérni, hívja meg StgCreateDocfile vagy StgOpenStorage. Ezek a függvények lekérnek egy IStorage mutatót, amellyel meghívhatja CreateStream vagy OpenStream egy IStream mutatóhoz. Mindkét esetben ugyanazt a IStream implementációs kódot használja.
Jegyzet
A strukturált tároló összetett fájlmegvalósításának nem sikerül az ISequentialStreamQueryInterface metódusa, de tartalmazza az Olvasási és Írás metódusokat az IStream interfészmutatóján keresztül.
Mikor érdemes használni?
Az IStreammetódusainak meghívása adatok olvasásához és streambe való írásához.
Mivel a streamobjektumok más folyamatokba is továbbíthatók, az alkalmazások globális memória használata nélkül oszthatják meg az adatokat a tárolóobjektumokban. A streamobjektumok COM összetett fájlban történő implementálásában a COM egyéni tárolólétesítményei létrehozzák az eredeti objektum távoli verzióját az új folyamatban, amikor a két folyamat megosztott memória-hozzáféréssel rendelkezik. Így a távoli verziónak nem kell kommunikálnia az eredeti folyamattal a funkciói végrehajtásához.
A streamobjektum távoli verziója ugyanazzal a keresési mutatóval rendelkezik, mint az eredeti stream. Ha nem szeretné megosztani a keresési mutatót, használja a IStream::Clone metódust a távoli folyamat streamobjektumának másolatának biztosításához.
Jegyzet
Ha a számítógép memóriájában lévő halomnál nagyobb streamobjektumot hoz létre, és egy HGLOBAL leírót használ egy globális memóriaobjektumhoz, a streamobjektum belsőleg meghívja a GlobalRealloc metódust, ha több memóriát igényel. Mivel GlobalRealloc mindig átmásolja az adatokat a forrásból a célhelyre, a streamobjektumok 20 MB-ról 25 MB-ra való növeléséhez például nagy mennyiségű idő szükséges. Ez a másolt növekmények méretének köszönhető, és rosszabbodik, ha a lemezcserélés miatt a számítógépen kevesebb mint 45 MB memória található.
Az előnyben részesített megoldás egy IStream metódus implementálása, amely VirtualAlloc által lefoglalt memóriát használ GlobalAllochelyett. Ez lefoglalhat egy nagy méretű virtuális címteret, majd szükség szerint véglegesítheti a memóriát ezen a címtéren belül. Nem történik adatmásolás, és a memória csak a szükséges módon lesz véglegesített.
A GlobalRealloc másik lehetősége, hogy meghívja a IStream::SetSize metódust a streamobjektumon a memóriafoglalás előzetes növeléséhez. Ez azonban nem olyan hatékony, mint VirtualAllochasználata a fent leírtak szerint.
Módszerek
-
Meghatározott számú bájtot olvas be a streamobjektumból a memóriába az aktuális keresési mutatótól kezdve. Ez a megvalósítás S_OK ad vissza, ha az olvasás során elérte a stream végét. (Ez ugyanaz, mint a fat fájlrendszer MS-DOS ben található "fájl vége" viselkedés.)
-
Megadott számot ír bájtokból a streamobjektumba az aktuális keresési mutatótól kezdve. Ebben a megvalósításban a streamobjektumok nem ritkák. A rendszer végül lefoglalja a kitöltő bájtokat a lemezen, és hozzárendeli a streamhez.
-
A keresési mutatót a stream elejéhez, a stream végéhez vagy az aktuális keresési mutatóhoz képest egy új helyre módosítja.
-
Módosítja a streamobjektum méretét. Ebben a megvalósításban nincs garancia arra, hogy a lefoglalt terület egybefüggő lesz.
-
Adott számú bájtot másol át a stream aktuális keresési mutatójából egy másik stream aktuális keresési mutatójára.
-
Az IStream összetett fájl implementációja csak közvetlen módban, nem tranzakciós módban támogatja a streamek megnyitását. Ezért a metódusnak nincs más hatása, mint az összes memóriapuffer kiürítése a következő tárolási szintre.
Ebben a megvalósításban nem számít, hogy a streamek módosításait véglegesíti-e, csak a tárobjektumok módosításait kell véglegesítenie.
-
IStream:: visszaállítása
-
Ez az implementáció nem támogatja a tranzakciós adatfolyamokat, ezért a metódus hívásának nincs hatása.
-
Ez az implementáció nem támogatja a tartományzárolást, ezért a metódus hívásának nincs hatása.
-
Eltávolítja a hozzáférési korlátozást egy korábban korlátozott bájttartományon az IStream::LockRegionhasználatával.
-
Lekéri a STATSTG struktúráját ehhez a streamhez
-
Létrehoz egy új streamobjektumot a saját keresési mutatójával, amely az eredeti adatfolyammal megegyező bájtokra hivatkozik.
Az egyszerű módú IStream a következő korlátozások vonatkoznak.
- A streamek egyszerű módúak, ha egy egyszerű módú tárolóból hozták létre vagy nyitották meg. A tároló egyszerű mód, ha a grfMode paraméterben beállított STGM_SIMPLE jelzővel jön létre vagy nyílik meg.
- A Clone és CopyTo metódusok nem támogatottak.
- A Stat metódus támogatott, de meg kell adni a STATFLAG_NONAME értéket.
Kapcsolódó témakörök