IStream - Implementasi File Gabungan
Antarmuka IStream mendukung membaca dan menulis data untuk mengalirkan objek. Dalam objek penyimpanan terstruktur, objek aliran berisi data dan penyimpanan yang menyediakan struktur. Data sederhana dapat ditulis langsung ke aliran, tetapi lebih sering, aliran adalah elemen yang disarangkan 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 memerlukan penunjuk pencarian 64-bit. Namun, implementasi COM hanya mendukung aliran hingga 2³² byte panjang (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 pointer IStream dengan memanggil fungsi API CreateStreamOnHGlobal. Untuk mendapatkan penunjuk IStream dalam objek file gabungan, panggil StgCreateDocfile atau StgOpenStorage. Fungsi-fungsi ini mengambil penunjuk 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 di-marshal ke proses lain, aplikasi dapat berbagi data dalam objek penyimpanan tanpa harus menggunakan memori global. Dalam implementasi file gabungan COM dari 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 aliran untuk proses jarak jauh.
Catatan
Jika membuat objek aliran yang lebih besar dari timbunan dalam memori komputer Anda dan Anda menggunakan handel HGLOBAL ke objek memori global, objek stream memanggil metode GlobalRealloc secara internal ketika membutuhkan lebih banyak memori. Karena GlobalRealloc selalu menyalin data dari sumber ke tujuan, meningkatkan objek streaming dari 20 MB menjadi 25 MB, misalnya, membutuhkan waktu dalam jumlah besar. Ini karena ukuran kenaikan yang disalin dan diperburuk jika ada kurang dari 45 MB memori di komputer karena pertukaran disk.
Solusi yang disukai adalah menerapkan metode IStream yang menggunakan memori yang dialokasikan oleh VirtualAlloc alih-alih GlobalAlloc. Ini dapat mencadangkan sebagian besar ruang alamat virtual dan kemudian menerapkan memori dalam ruang alamat tersebut sesuai kebutuhan. Tidak ada penyalinan data yang terjadi dan memori hanya diterapkan 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
-
Membaca jumlah byte tertentu dari objek aliran ke dalam 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.)
-
Menulis angka tertentu dari byte ke objek aliran yang dimulai pada penunjuk pencarian saat ini. Dalam implementasi ini, objek aliran tidak jarang. Byte isian apa pun akhirnya dialokasikan pada disk dan ditetapkan ke aliran.
-
Mengubah penunjuk pencarian ke lokasi baru yang relatif terhadap awal aliran, ke akhir aliran, atau ke penunjuk pencarian saat ini.
-
Mengubah ukuran objek stream. Dalam implementasi ini, tidak ada jaminan bahwa ruang yang dialokasikan akan berdekatan.
-
Menyalin jumlah byte tertentu dari penunjuk pencarian saat ini di aliran ke penunjuk pencarian saat ini di aliran lain.
-
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.
-
Implementasi ini tidak mendukung aliran yang ditransaksikan, sehingga panggilan ke metode ini tidak berpengaruh.
-
Penguncian rentang tidak didukung oleh implementasi ini, sehingga panggilan ke metode ini tidak berpengaruh.
-
Menghapus pembatasan akses pada rentang byte yang sebelumnya dibatasi dengan IStream::LockRegion.
-
Mengambil struktur STATSTG untuk aliran ini
-
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 diatur dalam parameter grfMode .
- Metode Kloning dan CopyTo tidak didukung.
- Metode Stat didukung, tetapi nilai STATFLAG_NONAME harus ditentukan.
Topik terkait