上次发表了一篇文章,因为太过于匆忙了,所以写得不是很好,也不全面,请大家见谅。关于读复合文档,查了相关资料,,如果不知道数据长度,也是可以读出来的。用到的是一个 STATSTG 的类型,也非常简单,下面给出主要代码。
写复合文档 IStream *pStream; IStorage *pStgRoot,*pStgSub; CString strText("Hello World!\nHow are you?"); DWORD dwMode=STGM_CREATE|STGM_WRITE|STGM_SHARE_EXCLUSIVE; StgCreateDocfile(FILENAME,dwMode,0,&pStgRoot); // 创建一个复合文档,然后交由 pStgRoot 进行读写 pStgRoot->CreateStorage(L"StgRoot",dwMode,0,0,&pStgSub); // 创建一个子 IStorage ,交由 pStgSub 进行读写 pStgSub->CreateStream(L"Stream",dwMode,0,0,&pStream); // 创建一个子 IStream ,交由 pStream 进行读写 pStream->Write((LPTSTR)(LPCTSTR)strText,strText.GetLength(),NULL); // 写入数据 // 必需释放资源,否则写入不完全 pStream->Release(); pStgSub->Release(); pStgRoot->Release();
读复合文档 IStorage *pStgRoot,*pStgSub; IStream *pStream; STATSTG statstg; // 包含有关打开的存储、流或字节数组对象的统计信息 CString strText; // 用于存放读入的数据 long nLen=0; // 要读入的数据长度 DWORD dwMode=STGM_READ|STGM_SHARE_EXCLUSIVE; StgOpenStorage(FILENAME,NULL,dwMode,NULL,0,&pStgRoot); // 打开一个复合文档,交由 pStgRoot 进行读 pStgRoot->OpenStorage(L"StgRoot",NULL,dwMode,NULL,0,&pStgSub); // 打开一个子存储,交由 pStgSub 进行读 pStgSub->OpenStream(L"Stream",NULL,dwMode,0,&pStream); // 打开一个子数据流,交由 pStream 进行读 pStream->Stat(&statstg,STATFLAG_NONAME); // 获得数据流的相关信息 nLen=statstg.cbSize.QuadPart; // 获得数据流长度 pStream->Read(strText.GetBuffer(nLen),nLen,NULL); // 读入数据 // 释放资源 strText.ReleaseBuffer(); // 释放 strText 的缓冲区 pStream->Release(); pStgSub->Release(); pStgRoot->Release(); AfxMessageBox(strText);
因为较简单,而且之前一篇文章讲过了,在此就不详细说明了。以上代码在VC6.0 中编译通过