创建个MFC的简单功能来调用以下接口
void testWrite()
{
// TODO: Add your control notification handler code here
const unsigned short *FILENAME = L"c:\\test.stg";
DWORD dwMode=STGM_WRITE|STGM_CREATE|STGM_SHARE_EXCLUSIVE; // 只写|如果文件存在则替换,不存在则创建|独占
IStorage *pStgRoot,*pStgSub;
IStream *pStream;
pStgRoot=NULL; // 设为NULL,可以知道函数是否执行成功
// 创建复合文档
// 如果文件不存在则创建一个新文件,已经存在则替换原文件
// 创建完成后得到一个新的storage对象,可用于创建一个根目录
StgCreateDocfile(
FILENAME, // 复合文档路径
dwMode, // 请问模式
0, // 必须为0
&pStgRoot // 返回一个新的storage对象
);
// 创建一个根目录,并准备创建一个子目录
pStgRoot->CreateStorage(
L"StgRoot", // 子IStorage的名称
dwMode, // 请问模式
0, // 必须为0
0, // 必须为0
&pStgSub // 返回一个新的storage对象
);
// 创建一个数据流(结点),并准备写入数据
pStgSub->CreateStream(
L"Stm", // 子IStream的名称
dwMode, // 请问模式
0, // 必须为0
0, // 必须为0
&pStream // 返回一个新的IStream接口指针
);
// 写入数据
char strText[]={"Hello World2!"};
ULONG actWrite;
int nLen=strlen(strText); // 字串长度
pStream->Write(
strText, // 要写入的数据
nLen, // 要写入数据的长度
&actWrite // 实际写入长度,也可以设为NULL
);
// 释放资源
// 如果不调用Release()方法,会导致写入不完全、文档体积大、无法正常读取等问题
pStream->Release();
pStgSub->Release();
pStgRoot->Release();
CString strMsg;
strMsg.Format("数据长度:%d , 实际写入长度:%ld",nLen,actWrite);
AfxMessageBox(strMsg);
cout<<strMsg.GetBuffer(100)<<endl;
}
void testRead()
{
DWORD dwMode=STGM_READ|STGM_SHARE_EXCLUSIVE; // 只读|独占
const unsigned short *FILENAME = L"c:\\test.stg";
IStorage *pStgRoot,*pStgSub;
IStream *pStream;
pStgRoot=NULL;
pStgSub=NULL;
pStream=NULL;
// 打开文件
StgOpenStorage(
FILENAME,
NULL,
dwMode,
NULL,
0,
&pStgRoot
);
// 打开一个目录
pStgRoot->OpenStorage(
L"StgRoot", // 注意大小写
NULL,
dwMode,
NULL,
0,
&pStgSub
);
// 准备读取数据
pStgSub->OpenStream(
L"Stm",
NULL,
dwMode,
0,
&pStream
);
// 读取数据
const int nLen=255; // 准备读入的长度
char strText[nLen]={0}; // 必须指定初始值,否则会显示出乱码,也可以设为 '\0'
ULONG actRead;
pStream->Read(
strText, // 存放放入的数据的缓冲区
nLen, // 要读入数据的长度,如不清楚可以设为较大的数
&actRead // 实际读入的长度
);
// 释放资源
pStream->Release();
pStgSub->Release();
pStgRoot->Release();
AfxMessageBox(strText);
CString strMsg;
strMsg.Format("指定读入数据的长度:%d , 实际读入数据长度:%ld",nLen,actRead);
AfxMessageBox(strMsg);
}