IStream – Implementierung von Verbunddateien

Die IStream-Schnittstelle unterstützt das Lesen und Schreiben von Daten in Streamobjekte. In einem strukturierten Speicherobjekt enthalten Streamobjekte die Daten und Speicher die Struktur. Einfache Daten können direkt in einen Datenstrom geschrieben werden, aber häufiger 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. Beispielsweise definiert die IStream-Schnittstelle Datenströme bis zu 2⁶⁴ Bytes länge, die einen 64-Bit-Suchzeiger erfordern. Die COM-Implementierung unterstützt jedoch nur Datenströme mit einer Länge von bis zu 2¹² (4 GB) und Lese- und Schreibvorgänge sind immer auf jeweils 2² Bytes beschränkt. Die COM-Implementierung unterstützt auch keine Datenstromtransaktions- oder Regionssperre.

Um einen einfachen Datenstrom basierend auf dem globalen Speicher zu erstellen, rufen Sie einen IStream-Zeiger ab, indem Sie die API-Funktion CreateStreamOnHGlobal aufrufen. Rufen Sie zum Abrufen eines IStream-Zeigers innerhalb eines Verbunddateiobjekts entweder StgCreateDocfile oder StgOpenStorage auf. 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 zusammengesetzte Dateiimplementierung des strukturierten Speichers ist für eine QueryInterface-Methode für ISequentialStream nicht erfolgreich, enthält jedoch die Methoden "Read" und "Write" über den IStream-Schnittstellenzeiger.

 

Verwendung

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

Da Streamobjekte an andere Prozesse gemarstet werden können, können Anwendungen die Daten in Speicherobjekten freigeben, ohne den globalen Speicher verwenden zu müssen. In der COM-Verbunddateiimplementierung von Datenstromobjekten erstellen die benutzerdefinierten Marshalling-Einrichtungen in COM eine Remoteversion des ursprünglichen Objekts im neuen Prozess, wenn die beiden Prozesse zugriff auf gemeinsam genutzten Speicher haben. Daher muss die Remoteversion nicht mit dem ursprünglichen Prozess kommunizieren, um seine Funktionen auszuführen.

Die Remoteversion des Streamobjekts verwendet den gleichen Suchzeiger wie der ursprüngliche Datenstrom. Wenn Sie den Suchzeiger nicht freigeben möchten, verwenden Sie die IStream::Clone-Methode , um eine Kopie des Datenstromobjekts für den Remoteprozess bereitzustellen.

Hinweis

Wenn Sie ein Streamobjekt erstellen, das größer als der Heap im Speicher Ihres Computers ist und Sie ein HGLOBAL-Handle für ein globales Speicherobjekt verwenden, ruft das Streamobjekt die GlobalRealloc-Methode intern auf, wenn mehr Arbeitsspeicher erforderlich ist. Da GlobalRealloc immer Daten aus der Quelle an das Ziel kopiert, erfordert das Erhöhen eines Datenstromobjekts von 20 MB auf 25 MB beispielsweise große Zeitmengen. Dies liegt an der Größe der kopierten Inkremente und wird verschlechtert, wenn aufgrund des Austauschs des Datenträgers weniger als 45 MB Arbeitsspeicher auf dem Computer vorhanden sind.

Die bevorzugte Lösung besteht darin, eine IStream-Methode zu implementieren, die den von VirtualAlloc zugewiesenen Arbeitsspeicher anstelle von GlobalAlloc verwendet. Dies kann einen großen Teil des virtuellen Adressraums reservieren und dann den Speicher innerhalb dieses Adressraums nach Bedarf übernehmen. Es tritt kein Datenkopiervorgang auf, und der Arbeitsspeicher wird nur so zugesichert, wie es erforderlich ist.

Eine Alternative zu GlobalRealloc besteht darin, die IStream::SetSize-Methode für das Streamobjekt aufzurufen, um die Speicherzuweisung 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 Lesens erreicht wurde. (Dies entspricht dem Verhalten "Ende der Datei", das im MS-DOS FAT-Dateisystem zu finden ist.)

ISequentialStream::Write

Schreibt eine angegebene Zahl aus Bytes in das Datenstromobjekt ab dem aktuellen Suchzeiger. In dieser Implementierung sind Streamobjekte nicht gering. Alle Füllbytes werden schließlich auf dem Datenträger zugewiesen und dem Datenstrom 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 Datenstromobjekts. In dieser Implementierung gibt es keine Garantie dafür, dass der zugewiesene Raum 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 zusammengesetzte Dateiimplementierung von IStream unterstützt das Öffnen von Datenströmen nur im direkten Modus, nicht im Transaktionsmodus. Daher hat die Methode keine Auswirkung, wenn sie nicht aufgerufen wird, um alle Speicherpuffer auf die nächste Speicherebene zu leeren.

Bei dieser Implementierung spielt es keine Rolle, ob Sie Änderungen an Datenströmen übernehmen, sie müssen nur Änderungen für Speicherobjekte übernehmen.

IStream::Revert

Diese Implementierung unterstützt keine transacted Streams, sodass ein Aufruf dieser Methode keine Auswirkung hat.

IStream::LockRegion

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

IStream::UnlockRegion

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

IStream::Stat

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

IStream

IStorage

CreateStreamOnHGlobal

StgCreateDocfile

StgOpenStorage