IStream – Implementierung zusammengesetzter Dateien

Die IStream-Schnittstelle unterstützt das Lesen und Schreiben von Daten zum Streamen von Objekten. 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äufig sind Datenströme Elemente, die in einem Speicherobjekt geschachtelt sind. Sie ähneln Standarddateien.

Die Spezifikation von IStream definiert mehr Funktionen, als die COM-Implementierung unterstützt. 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³² Bytes (4 GB), und Lese- und Schreibvorgänge sind immer auf jeweils 2³² Bytes beschränkt. Die COM-Implementierung unterstützt auch keine Streamtransaktions- oder Regionssperrung.

Um einen einfachen Stream auf Basis des globalen Arbeitsspeichers zu erstellen, rufen Sie einen IStream-Zeiger ab, indem Sie die API-Funktion CreateStreamOnHGlobal aufrufen. Um einen IStream-Zeiger in einem zusammengesetzten Dateiobjekt abzurufen, rufen Sie entweder StgCreateDocfile oder StgOpenStorage auf. Diese Funktionen rufen einen IStorage-Zeiger ab, mit dem Sie createStream oder OpenStream für einen IStream-Zeiger aufrufen können. In beiden Fällen wird der gleiche IStream-Implementierungscode verwendet.

Hinweis

Die Zusammengesetzte Dateiimplementierung des strukturierten Speichers ist bei einer QueryInterface-Methode für ISequentialStream nicht erfolgreich, umfasst jedoch die Methoden Read und Write über den IStream-Schnittstellenzeiger .

 

Einsatzgebiet

Rufen Sie die Methoden von IStream auf, um Daten zu lesen und in einen Stream zu schreiben.

Da Streamobjekte an andere Prozesse gemarst 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 Marshallfunktionen in COM eine Remoteversion des ursprünglichen Objekts im neuen Prozess, wenn die beiden Prozesse Zugriff auf shared-memory haben. Daher muss die Remoteversion nicht mit dem ursprünglichen Prozess kommunizieren, um ihre Funktionen auszuführen.

Die Remoteversion des Streamobjekts verwendet denselben 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, wenn es mehr Arbeitsspeicher benötigt. Da GlobalRealloc immer Daten aus der Quelle in das Ziel kopiert, erfordert das Erhöhen eines Streamobjekts von beispielsweise 20 MB auf 25 MB viel Zeit. Dies liegt an der Größe der kopierten Inkremente und verschlechtert sich, wenn auf dem Computer aufgrund des Datenträgeraustauschs weniger als 45 MB Arbeitsspeicher vorhanden sind.

Die bevorzugte Lösung besteht darin, eine IStream-Methode zu implementieren, die Arbeitsspeicher verwendet, der von VirtualAlloc anstelle von GlobalAlloc zugewiesen wird. Dies kann einen großen Teil des virtuellen Adressraums reservieren und dann bei Bedarf Speicher innerhalb dieses Adressraums committen. Es wird kein Datenkopiervorgang durchgeführt, und der Arbeitsspeicher wird nur nach Bedarf committet.

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

ISequentialStream::Read

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 Datenstroms während des Lesevorgangs erreicht wurde. (Dies ist identisch mit dem Verhalten "Ende der Datei", das im MS-DOS FAT-Dateisystem gefunden wird.)

ISequentialStream::Write

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.

IStream::Seek

Verschiebt den Suchzeiger auf eine neue Position im Verhältnis zum Anfang oder Ende des Datenstroms bzw. zum aktuellen Suchzeiger.

IStream::SetSize

Ändert die Größe des Streamobjekts. In dieser Implementierung gibt es keine Garantie, dass der zugewiesene Platz zusammenhängend ist.

IStream::CopyTo

Kopiert eine angegebene Anzahl von Bytes vom aktuellen Suchzeiger im Datenstrom an den aktuellen Suchzeiger in einem anderen Datenstrom.

IStream::Commit

Die Implementierung von zusammengesetzten Dateien von IStream unterstützt das Öffnen von Streams nur im direkten Modus, nicht im Transaktionsmodus. Daher hat die Methode beim Aufrufen keine anderen Auswirkungen, als alle Speicherpuffer auf die nächste Speicherebene zu leeren.

In dieser Implementierung spielt es keine Rolle, ob Sie Änderungen an Streams commiten. Sie benötigen nur Commitänderungen für Speicherobjekte.

IStream::Revert

Diese Implementierung unterstützt keine transaktionsierten Datenströme, sodass ein Aufruf dieser Methode keine Auswirkungen hat.

IStream::LockRegion

Die Bereichssperre wird von dieser Implementierung nicht unterstützt, sodass ein Aufruf dieser Methode keine Auswirkungen hat.

IStream::UnlockRegion

Entfernt die Zugriffsbeschränkung für einen Bereich von Bytes, der zuvor mit IStream::LockRegion eingeschränkt war.

IStream::Stat

Ruft die STATSTG-Struktur für diesen Stream ab.

IStream::Clone

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 der einfache Modus, wenn er aus einem Speicher im einfachen Modus erstellt oder geöffnet wurde. Ein Speicher ist ein einfacher Modus, wenn er mit dem im grfMode-Parameter festgelegten STGM_SIMPLE-Flag erstellt oder geöffnet wird.
  • Die Clone- und CopyTo-Methoden werden nicht unterstützt.
  • Die Stat-Methode wird unterstützt, aber der STATFLAG_NONAME Wert muss angegeben werden.

IStream

IStorage

CreateStreamOnHGlobal

StgCreateDocfile

StgOpenStorage