IStream - Implementasi File Manggala

Antarmuka IStream mendukung membaca dan menulis data untuk mengalirkan objek. Dalam objek penyimpanan terstruktur, objek stream berisi data dan penyimpanan menyediakan struktur. Data sederhana dapat ditulis langsung ke aliran, tetapi lebih sering, aliran adalah elemen yang ditumpuk dalam objek penyimpanan. File tersebut mirip dengan file standar.

Spesifikasi IStream mendefinisikan lebih banyak fungsionalitas daripada yang didukung implementasi COM. Misalnya, antarmuka IStream mendefinisikan aliran hingga 2⁶⁴ byte panjang yang membutuhkan penunjuk pencarian 64-bit. Namun, implementasi COM hanya mendukung aliran hingga 2³² byte panjangnya (4 GB) dan operasi baca dan tulis selalu dibatasi hingga 2³² byte pada satu waktu. Implementasi COM juga tidak mendukung transaksi aliran atau penguncian wilayah.

Untuk membuat aliran sederhana berdasarkan memori global, dapatkan penunjuk IStream dengan memanggil fungsi API CreateStreamOnHGlobal. Untuk mendapatkan penunjuk IStream dalam objek file gabungan, panggil StgCreateDocfile atau StgOpenStorage. Fungsi-fungsi ini mengambil pointer IStorage , yang kemudian dapat Anda panggil CreateStream atau OpenStream untuk pointer IStream . Dalam kedua kasus, kode implementasi IStream yang sama digunakan.

Catatan

Implementasi file majemuk dari penyimpanan terstruktur tidak berhasil pada metode QueryInterface untuk ISequentialStream, tetapi mencakup metode Baca dan Tulis melalui penunjuk antarmuka IStream .

 

Kapan Digunakan

Panggil metode IStream untuk membaca dan menulis data ke aliran.

Karena objek stream dapat dirusak ke proses lain, aplikasi dapat berbagi data dalam objek penyimpanan tanpa harus menggunakan memori global. Dalam implementasi file gabungan objek aliran, fasilitas marshaling kustom di COM membuat versi jarak jauh dari objek asli dalam proses baru ketika kedua proses memiliki akses memori bersama. Dengan demikian, versi jarak jauh tidak perlu berkomunikasi dengan proses asli untuk menjalankan fungsinya.

Versi jarak jauh objek stream berbagi penunjuk pencarian yang sama dengan aliran asli. Jika Anda tidak ingin berbagi penunjuk pencarian, gunakan metode IStream::Clone untuk menyediakan salinan objek stream untuk proses jarak jauh.

Catatan

Jika membuat objek stream yang lebih besar dari tumpukan dalam memori komputer Anda dan Anda menggunakan handel HGLOBAL ke objek memori global, objek aliran memanggil metode GlobalRealloc secara internal, itu membutuhkan lebih banyak memori. Karena GlobalRealloc selalu menyalin data dari sumber ke tujuan, meningkatkan objek stream dari 20 MB menjadi 25 MB, misalnya, membutuhkan waktu yang besar. Hal ini disebabkan oleh ukuran kenaikan yang disalin dan diperburuk jika memori kurang dari 45 MB di komputer karena pertukaran disk.

Solusi yang disukai adalah menerapkan metode IStream yang menggunakan memori yang dialokasikan oleh VirtualAlloc alih-alih GlobalAlloc. Ini dapat memesan sebagian besar ruang alamat virtual dan kemudian menerapkan memori dalam ruang alamat tersebut sesuai kebutuhan. Tidak ada penyalinan data yang terjadi dan memori hanya dilakukan karena diperlukan.

Alternatif untuk GlobalRealloc adalah memanggil metode IStream::SetSize pada objek stream untuk meningkatkan alokasi memori terlebih dahulu. Namun, ini tidak seefisien menggunakan VirtualAlloc, seperti yang dijelaskan di atas.

 

Metode

ISequentialStream::Read

Membaca jumlah byte tertentu dari objek aliran ke memori yang dimulai pada penunjuk pencarian saat ini. Implementasi ini mengembalikan S_OK jika akhir aliran tercapai selama pembacaan. (Ini sama dengan perilaku "akhir file" yang ditemukan dalam sistem file MS-DOS FAT.)

ISequentialStream::Write

Menulis angka tertentu dari byte ke dalam objek aliran yang dimulai pada penunjuk pencarian saat ini. Dalam implementasi ini, objek stream tidak jarang. Setiap byte pengisian akhirnya dialokasikan pada disk dan ditetapkan ke aliran.

IStream::Seek

Mengubah penunjuk pencarian ke lokasi baru yang relatif terhadap awal aliran, ke akhir aliran, atau ke penunjuk pencarian saat ini.

IStream::SetSize

Mengubah ukuran objek stream. Dalam implementasi ini, tidak ada jaminan bahwa ruang yang dialokasikan akan berdekatan.

IStream::CopyTo

Menyalin jumlah byte tertentu dari penunjuk pencarian saat ini di aliran ke penunjuk pencarian saat ini di aliran lain.

IStream::Commit

Implementasi file majemuk IStream mendukung pembukaan aliran hanya dalam mode langsung, bukan mode yang ditransaksikan. Oleh karena itu, metode ini tidak berpengaruh ketika dipanggil selain untuk membersihkan semua buffer memori ke tingkat penyimpanan berikutnya.

Dalam implementasi ini, tidak masalah jika Anda melakukan perubahan pada aliran, Anda hanya perlu menerapkan perubahan untuk objek penyimpanan.

IStream::Kembalikan

Implementasi ini tidak mendukung aliran yang ditransaksikan, sehingga panggilan ke metode ini tidak berpengaruh.

IStream::LockRegion

Penguncian rentang tidak didukung oleh implementasi ini, sehingga panggilan ke metode ini tidak berpengaruh.

IStream::UnlockRegion

Menghapus pembatasan akses pada rentang byte yang sebelumnya dibatasi dengan IStream::LockRegion.

IStream::Stat

Mengambil struktur STATSTG untuk aliran ini

IStream::Kloning

Membuat objek stream baru dengan penunjuk pencariannya sendiri yang mereferensikan byte yang sama dengan aliran asli.

IStream mode sederhana tunduk pada batasan berikut.

  • Streaming adalah mode sederhana jika dibuat atau dibuka dari penyimpanan mode sederhana. Penyimpanan adalah mode sederhana jika dibuat atau dibuka dengan bendera STGM_SIMPLE yang diatur dalam parameter grfMode .
  • Metode Kloning dan CopyTo tidak didukung.
  • Metode Stat didukung, tetapi nilai STATFLAG_NONAME harus ditentukan.

IStream

IStorage

CreateStreamOnHGlobal

StgCreateDocfile

StgOpenStorage