關於COM中的複合文檔
結構化的儲存
在永久儲存機制下,普通檔案都是用位元組組織的.每個檔案都是沒有次序的位元組組成的.
而整個檔案則是一塊的形式儲存在磁碟中的,並且每個塊都是離散的.當你要讀某個檔案
的時候檔案系統會管理它的指標並返回要讀取的位元組流.
COM採用另一種更為合理的方法來隱藏檔和資料.這種方式就叫結構化儲存.結構化儲存
採用的辦法是把檔案預先加工後儲存在一個文檔結構中.這裡要使用兩個COM對象.storages
和streams.storage對象很類似與檔案系統中的目錄,它可以包含其它的storage對象和stream
對象.你可以把stream對象理解成檔案系統中的檔案.和檔案一樣,stream對象包含資料,stored
則象一個連續的位元組塊.每一個複合文檔都包含以上兩個對象.COM通過兩個借口來訪問上面兩個對象
IStorage和IStream.
為什麼我們需要結構化儲存?
是的,要知道你的複合文檔中包括,圖象,文字,等等其它一些資料.好啦,現在你大概希望把它們
放到一起去.以前的做法是當你要儲存檔案的時候,檔案系統會把原檔案重寫從而把你的新的資料
加入進來.聽上去很花時間和精力是嗎?是的,所結構化處理採用另外一個辦法.新的資料存放區到
老的資料後面.是的就想檔案系統那樣存放到新的檔案夾那樣所不同的是它使用的是storage對象
和stream對象.下面看看它給我們帶來了什麼好處
1.結構化儲存能夠讓你完全控制每一個獨立的對象,每次讀/寫你不必去讀寫整個檔案,而可以讀/寫你
想要的段落.
2.並且一個使用者可以並發的讀/寫同一個檔案
複合文檔:就是把不同類型的資料存放區在一個檔案中.如一個word檔案可以包括excel的圖表,圖象
表格,或者其它資料.
現在讓我們來看它的兩個介面
IStorage 介面
如你所想的那樣它就象檔案系統中的目錄.
IStream 介面
它用來讀/寫資料到stream對象.
你可以到MSDN上尋找到相應的文檔.
最後讓我們舉個例子,來看看他們是如何工作的.
步驟如下:
1.首先要調用StgCreateDocfile函數來建立一個儲存根對象.我們的複合檔案要
儲存每一個儲存物件和流對象.StgCreateDocfile函數返回一個IStorage介面指標
2.調用IStorage的CreateStream來建立一個流對象.該函數返回一個IStream的指標
3.最後調用IStream的wirte函數來寫如流.
原始碼如下:
#include <objbase.h.>
int main(int argc, char* argv[])
{
CoInitialize(NULL);
IStorage* pStr;
HRESULT hr = StgCreateDocfile( L"test.mcb", STGM_DIRECT|STGM_CREATE|STGM_READWRITE|STGM_SHARE_EXCLUSIVE, NULL, &pStr);
IStream* pStream;
hr = pStr->CreateStream( L"mcbStream", STGM_DIRECT|STGM_CREATE|STGM_READWRITE|STGM_SHARE_EXCLUSIVE, 0, 0, &pStream );
ULONG name;
char data[] = "Mahesh testing " ;
pStream->Write( data, strlen(data), &name ) ;
CoUninitialize();
return 0;
}
希望對各位有點協助,希望大家對指教.(完)