IStream – Verbunddateiimplementierungen
Die IStream-Schnittstelle unterstützt das Lesen und Schreiben von Daten in Streamobjekte. In einem strukturierten Speicherobjekt enthalten Streamobjekte die Daten, und Speicher stellen die Struktur bereit. Einfache Daten können direkt in einen Stream geschrieben werden, aber häufiger sind Streams Elemente, die in einem Speicherobjekt geschachtelt sind. Sie ähneln Standarddateien.
Die Spezifikation von IStream definiert mehr Funktionalität, als von der COM-Implementierung unterstützt wird. Die IStream-Schnittstelle definiert beispielsweise Streams mit einer Länge von bis zu 2⁶⁴ Bytes, die einen 64-Bit-Suchzeiger erfordern. Die COM-Implementierung unterstützt jedoch nur Streams mit einer Länge von bis zu 2 gb (4 GB), und Lese- und Schreibvorgänge sind immer auf jeweils 2 gb beschränkt. Die COM-Implementierung unterstützt auch keine Streamtransaktionen oder Regionssperren.
Um einen einfachen Stream basierend auf dem globalen Arbeitsspeicher zu erstellen, rufen Sie einen IStream-Zeiger ab, indem Sie die API-Funktion CreateStreamOnHGlobalaufrufen. Um einen IStream-Zeiger in einem Verbunddateiobjekt abzurufen, rufen Sie entweder StgCreateDocfile oder StgOpenStorageauf. Diese Funktionen rufen einen IStorage-Zeiger ab, mit dem Sie dann CreateStream oder OpenStream für einen IStream-Zeiger aufrufen können. In beiden Fällen wird der gleiche IStream-Implementierungscode verwendet.
Hinweis
Die Verbunddateiimplementierung des strukturierten Speichers ist für eine QueryInterface-Methode für ISequentialStreamnicht erfolgreich, enthält jedoch die Read- und Write-Methoden über den IStream-Schnittstellenzeiger.
Verwendungs wann
Rufen Sie die Methoden von IStream auf, um Daten zu lesen und in einen Stream zu schreiben.
Da Streamobjekte an andere Prozesse gemarshallt werden können, können Anwendungen die Daten in Speicherobjekten freigeben, ohne globalen Arbeitsspeicher verwenden zu müssen. In der COM-Verbunddateiimplementierung von Streamobjekten erstellen die benutzerdefinierten Marshalling-Einrichtungen in COM eine Remoteversion des ursprünglichen Objekts im neuen Prozess, wenn die beiden Prozesse über Shared Memory-Zugriff verfügen. Daher muss die Remoteversion nicht mit dem ursprünglichen Prozess kommunizieren, um ihre Funktionen auszuführen.
Die Remoteversion des Streamobjekts verwendet den gleichen Suchzeiger wie der ursprüngliche Stream. Wenn Sie den Suchzeiger nicht freigeben möchten, verwenden Sie die IStream::Clone-Methode, um eine Kopie des Streamobjekts für den Remoteprozess bereitzustellen.
Hinweis
Wenn Sie ein Streamobjekt erstellen, das größer als der Heap im Arbeitsspeicher Ihres Computers ist, und Sie ein HGLOBAL-Handle für ein globales Speicherobjekt verwenden, ruft das Streamobjekt intern die GlobalRealloc-Methode auf, um mehr Arbeitsspeicher zu benötigen. Da GlobalRealloc daten immer aus der Quelle in das Ziel kopiert, erfordert beispielsweise das Erhöhen eines Streamobjekts von 20 MB auf 25 MB viel Zeit. Dies ist auf die Größe der kopierten Inkremente zurückzuführen und wird verringert, wenn aufgrund des Datenträgeraustauschs weniger als 45 MB Arbeitsspeicher auf dem Computer vorhanden sind.
Die bevorzugte Lösung besteht darin, eine IStream-Methode zu implementieren, die von VirtualAlloc belegten Arbeitsspeicher anstelle von GlobalAllocverwendet. Dadurch kann ein großer Teil des virtuellen Adressraums reserviert und anschließend nach Bedarf ein Commit des Arbeitsspeichers innerhalb dieses Adressraums erfolgen. Es erfolgt kein Datenkopiervorgang, und für den Arbeitsspeicher wird nur ein Commit ausgeführt, wenn er erforderlich ist.
Eine Alternative zu GlobalRealloc besteht darin, die IStream::SetSize-Methode für das Streamobjekt aufzurufen, um die Speicherbelegung im Voraus zu erhöhen. Dies ist jedoch nicht so effizient wie die Verwendung von VirtualAlloc, wie oben beschrieben.
Methoden
-
Liest eine angegebene Anzahl von Bytes beginnend beim aktuellen Suchzeiger aus dem Datenstromobjekt in den Arbeitsspeicher. Diese Implementierung gibt S _ OK zurück, wenn das Ende des Streams während des Lesens erreicht wurde. (Dies entspricht dem Verhalten des Dateiendes im MS-DOS FAT-Dateisystem.)
-
Schreibt eine angegebene Zahl aus Bytes ab dem aktuellen Suchzeiger in das Streamobjekt. In dieser Implementierung sind Streamobjekte nicht sparse. Alle Füllbytes werden schließlich auf dem Datenträger zugeordnet und dem Stream zugewiesen.
-
Verschiebt den Suchzeiger auf eine neue Position im Verhältnis zum Anfang oder Ende des Datenstroms bzw. zum aktuellen Suchzeiger.
-
Ändert die Größe des Streamobjekts. In dieser Implementierung gibt es keine Garantie dafür, dass der zugeordnete Speicherplatz zusammenhängend ist.
-
Kopiert eine angegebene Anzahl von Bytes vom aktuellen Suchzeiger im Datenstrom an den aktuellen Suchzeiger in einem anderen Datenstrom.
-
Die Verbunddateiimplementierungen von IStream unterstützen das Öffnen von Datenströmen nur im direkten Modus, nicht im Transaktionsmodus. Daher hat die -Methode keine Auswirkung, wenn sie aufgerufen wird, außer alle Speicherpuffer auf die nächste Speicherebene zu leeren.
In dieser Implementierung spielt es keine Rolle, ob Sie Änderungen an Streams committen, sondern nur Änderungen für Speicherobjekte committen müssen.
-
Diese Implementierung unterstützt keine transaktiven Datenströme, sodass ein Aufruf dieser Methode keine Auswirkungen hat.
-
Bereichssperren werden von dieser Implementierung nicht unterstützt, sodass ein Aufruf dieser Methode keine Auswirkungen hat.
-
Entfernt die Zugriffseinschränkung für einen Bereich von Bytes, der zuvor mit IStream::LockRegioneingeschränkt wurde.
-
Ruft die STATSTG-Struktur für diesen Stream ab.
-
Erstellt ein neues Datenstromobjekt mit einem eigenen Suchzeiger, der auf die gleichen Bytes wie der Originaldatenstrom verweist.
Ein IStream im einfachen Modus unterliegt den folgenden Einschränkungen.
- Ein Stream ist ein einfacher Modus, wenn er in einem Speicher im einfachen Modus erstellt oder geöffnet wurde. Ein Speicher ist ein einfacher Modus, wenn er mit dem STGM SIMPLE-Flag erstellt oder geöffnet wird, _ das im grfMode-Parameter festgelegt ist.
- Die Methoden Clone und CopyTo werden nicht unterstützt.
- Die Stat-Methode wird unterstützt, aber der STATFLAG _ NONAME-Wert muss angegeben werden.