Udostępnij przez


IStream — implementacja pliku złożonego

Interfejs IStream obsługuje odczytywanie i zapisywanie danych w obiektach strumieniowych. W obiekcie magazynu strukturalnego obiekty strumienia zawierają dane i magazyny zapewniają strukturę. Proste dane można zapisywać bezpośrednio w strumieniu, ale częściej strumienie są elementami zagnieżdżonym w obiekcie magazynu. Są one podobne do plików standardowych.

Specyfikacja IStream definiuje więcej funkcji niż obsługuje implementacja MODELU COM. Na przykład interfejs IStream definiuje strumienie do 2⁶⁴ bajtów o długości wymagającej wskaźnika wyszukiwania 64-bitowego. Jednak implementacja modelu COM obsługuje tylko strumienie o długości do 2³² bajtów (4 GB), a operacje odczytu i zapisu są zawsze ograniczone do 2³² bajtów jednocześnie. Implementacja modelu COM nie obsługuje również przesyłania strumieniowego transakcji ani blokowania regionów.

Aby utworzyć prosty strumień na podstawie pamięci globalnej, pobierz wskaźnik IStream IStream, wywołując funkcję interfejsu API CreateStreamOnHGlobal. Aby uzyskać wskaźnik IStream w obiekcie pliku złożonego, wywołaj StgCreateDocfile lub StgOpenStorage. Te funkcje pobierają wskaźnikIStorageIStorage, za pomocą którego można następnie wywołać CreateStream lub OpenStream dla wskaźnika IStream. W obu przypadkach jest używany ten sam kod implementacji IStream.

Nuta

Implementacja pliku złożonego magazynu strukturalnego nie powiedzie się w metodzie QueryInterface dla ISequentialStream, ale zawiera Read i Write metod za pośrednictwem wskaźnika interfejsu IStream.

 

Kiedy należy używać

Wywołaj metody IStream, aby odczytywać i zapisywać dane w strumieniu.

Ponieważ obiekty strumienia mogą być marshalowane do innych procesów, aplikacje mogą udostępniać dane w obiektach magazynu bez konieczności używania pamięci globalnej. W implementacji złożonego pliku COM obiektów strumienia niestandardowe obiekty marshalingowe w modelu COM tworzą zdalną wersję oryginalnego obiektu w nowym procesie, gdy dwa procesy mają dostęp do pamięci współdzielonej. W związku z tym wersja zdalna nie musi komunikować się z oryginalnym procesem w celu przeprowadzenia jego funkcji.

Zdalna wersja obiektu strumienia współudzieli ten sam wskaźnik wyszukiwania co oryginalny strumień. Jeśli nie chcesz udostępniać wskaźnika wyszukiwania, użyj metody IStream::Clone, aby udostępnić kopię obiektu strumienia dla procesu zdalnego.

Nuta

Jeśli tworzenie obiektu strumienia, który jest większy niż sterta w pamięci komputera i używasz HGLOBAL do obiektu pamięci globalnej, obiekt strumienia wywołuje metodę GlobalRealloc wewnętrznie, gdy wymaga więcej pamięci. Ponieważ GlobalRealloc zawsze kopiuje dane ze źródła do miejsca docelowego, zwiększenie obiektu strumienia z 20 MB do 25 MB, na przykład wymaga dużych ilości czasu. Jest to spowodowane rozmiarem skopiowanych przyrostów i pogarsza się, jeśli na komputerze jest mniej niż 45 MB pamięci z powodu zamiany dysku.

Preferowanym rozwiązaniem jest zaimplementowanie metody IStream, która używa pamięci przydzielonej przez VirtualAlloc zamiast GlobalAlloc. Może to zarezerwować duży fragment wirtualnej przestrzeni adresowej, a następnie zatwierdzić pamięć w tej przestrzeni adresowej zgodnie z potrzebami. Nie ma miejsca kopiowania danych, a pamięć jest zatwierdzana tylko wtedy, gdy jest to wymagane.

Alternatywą dla GlobalRealloc jest wywołanie metody IStream::SetSize obiektu strumienia w celu zwiększenia alokacji pamięci z wyprzedzeniem. Nie jest to jednak tak wydajne, jak używanie VirtualAlloc, jak opisano powyżej.

 

Metody

ISequentialStream::Read

Odczytuje określoną liczbę bajtów z obiektu strumienia do pamięci, zaczynając od bieżącego wskaźnika wyszukiwania. Ta implementacja zwraca S_OK, jeśli koniec strumienia został osiągnięty podczas odczytu. (Jest to takie samo, jak zachowanie "końca pliku" znalezione w systemie plików MS-DOS FAT).

ISequentialStream::Write

Zapisuje określoną liczbę z bajtów do obiektu strumienia rozpoczynającego się od bieżącego wskaźnika wyszukiwania. W tej implementacji obiekty strumienia nie są rozrzedłe. Wszystkie bajty wypełnienia zostaną ostatecznie przydzielone na dysku i przypisane do strumienia.

IStream::Seek

Zmienia wskaźnik wyszukiwania na nową lokalizację względem początku strumienia, na końcu strumienia lub do bieżącego wskaźnika wyszukiwania.

IStream::SetSize

Zmienia rozmiar obiektu strumienia. W tej implementacji nie ma gwarancji, że przydzielone miejsce będzie ciągłe.

IStream::CopyTo

Kopiuje określoną liczbę bajtów z bieżącego wskaźnika wyszukiwania w strumieniu do bieżącego wskaźnika wyszukiwania w innym strumieniu.

IStream::Commit

Implementacja pliku złożonego IStream obsługuje otwieranie strumieni tylko w trybie bezpośrednim, a nie w trybie transacted. W związku z tym metoda nie ma wpływu, gdy jest wywoływana inna niż opróżnianie wszystkich pamięci do następnego poziomu magazynu.

W tej implementacji nie ma znaczenia, czy zatwierdzisz zmiany w strumieniach, potrzebne są tylko zatwierdzenia zmian dla obiektów magazynu.

IStream::Revert

Ta implementacja nie obsługuje strumieni transakcyjnych, więc wywołanie tej metody nie ma wpływu.

IStream::LockRegion

Blokowanie zakresu nie jest obsługiwane przez tę implementację, więc wywołanie tej metody nie ma wpływu.

IStream::UnlockRegion

Usuwa ograniczenie dostępu do zakresu bajtów wcześniej ograniczonych IStream::LockRegion.

IStream::Stat

Pobiera strukturę STATSTG dla tego strumienia

IStream::Clone

Tworzy nowy obiekt strumienia z własnym wskaźnikiem wyszukiwania, który odwołuje się do tych samych bajtów co oryginalny strumień.

IStream w trybie prostympodlega następującym ograniczeniom.

  • Strumień jest trybem prostym, jeśli został utworzony lub otwarty z magazynu w trybie prostym. Magazyn jest trybem prostym, jeśli został utworzony lub otwarty z flagą STGM_SIMPLE ustawioną w parametrze grfMode.
  • Metody Clone i CopyTo nie są obsługiwane.
  • Obsługiwana jest metodaStat, ale należy określić wartość STATFLAG_NONAME.

IStream

IStorage

CreateStreamOnHGlobal

StgCreateDocfile

StgOpenStorage