敬业的IT人 >> 编程开发 >> C/C++ >> COM 组件设计与应用(一)起源及复合文件

COM 组件设计与应用(一)起源及复合文件

敬业的IT人 互联网 佚名 2008-1-3 19:18:24

图一、左侧表示一个磁盘下的文件组织方式,右侧表示一个复合文件内部的数据组织方式。


图二、运行示例程序一后,使用 DFView.exe 打开观察复合文件的效果图

示例二:打开一个复合文件,枚举其根存储下的所有对象。

#include // ANSI、MBCS、UNICODE 转换 void SampleEnum() { // 假设你已经做过 COM 初始化了 LPCTSTR lpFileName = _T( "c:\\a.stg" ); HRESULT hr; IStorage *pStg = NULL; USES_CONVERSION; // (注6) LPCOLESTR lpwFileName = T2COLE( lpFileName ); // 转换T类型为宽字符 hr = ::StgIsStorageFile( lpwFileName ); // 是复合文件吗? if( FAILED(hr) ) return; hr = ::StgOpenStorage( // 打开复合文件 lpwFileName, // 文件名称 NULL, STGM_READ | STGM_SHARE_DENY_WRITE, 0, 0, &pStg); // 得到根存储接口指针 IEnumSTATSTG *pEnum=NULL; // 枚举器 hr = pStg->EnumElements( 0, NULL, 0, &pEnum ); ASSERT( SUCCEEDED(hr) ); STATSTG statstg; while( NOERROR == pEnum->Next( 1, &statstg, NULL) ) { // statstg.type 保存着对象类型 STGTY_STREAM 或 STGTY_STORAGE // statstg.pwcsName 保存着对象名称 // ...... 还有时间,长度等很多信息。请查看 MSDN ::CoTaskMemFree( statstg.pwcsName ); // 释放名称所使用的内存(注6) } if( pEnum ) pEnum->Release(); if( pStg ) pStg->Release(); } 查看 进入讨论组讨论。
粤ICP备06119539号
Copyright CiscoSky.Org,Some Rights Reserved.
Email:me1228#tom.com