mfc编程时ole选项的复合文档类型什么意思

 我来答
huanglenzhi
2015-06-27 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
采纳数:117538 获赞数:517183
长期从事计算机组装,维护,网络组建及管理。对计算机硬件、操作系统安装、典型网络设备具有详细认知。

向TA提问 私信TA
展开全部
  1 引言
目前,传统的二层C/S(Client/Server)结构应用软件已发展为多层结构的分布式应用
系统[2]。为了改善系统的工作效率以及提高系统的伸缩性,很多软件开发人员都把服务器
上的一些基本数据分发到各个客户机上。这种工作模式的优点是显著的,因为它减少了那
些非实时数据(如员工表、产品数据表等)在网络上的流动,并且在网络瘫痪时,各个客
户机仍然可以维持部分的工作。同时,这种模式需要定时在客户机与服务器之间进行数据
更新,为了更有效地进行数据更新,我们设想在客户机上创建类似公文包的数据库,即与
服务器上的SQL Server一样,把所有的数据表保存在几个文件中。围绕这一问题,本文详
细分析了OLE 结构化文件的存储原理,并在Delphi 环境下深入讨论了与其相关的一系列
操作。

2 OLE复合文档的存储原理与操作
2.1 OLE复合文档的存储原理
OLE(Object linking and Embedding),即对象连接与嵌入的简称,是在Windows环境
下实现不同Windows 应用程序之间共享数据的一种方法。OLE 结构化文件,也称为OLE
复合文档,简单来说,OLE复合文档的结构化,实际上是指它的内容按照流(stream)和存
储(storage)的方式进行组织。MicrosoftWord和Excel的文件就是典型的OLE复合文档,
如图1所示,这种文档的内容类似操作系统中的文件系统,即文档内包含“文件夹“和“文
件”。其中,“文件夹”被称为存储,每个存储中所包含的连续数据即“文件”被称为流。
由于OLE复合文档中每一个“文件”都是彼此独立的,所以引言中提出的问题便得到很好
的解决,我们首先建立一个OLE复合文档,然后把众多的数据表以流的方式保存到该复合
文档中,这样,客户机与服务器在进行数据更新时仅是传递几个文件,非常有效。而且,
我们在把Paradox 7格式的数据表写入到OLE复合文档的过程中发现:OLE复合文档的容
量大小约是原来众多数据表容量的总和的50%。
OLE复合文档-----MyOleDoc.ole
DataBase -----存储
Employee -----流
Customer OLE Data
Excel 或AutoCad的数据

2.2 OLE复合文档的建立
可以使用Windows SDK 函数StgCreateDocFile 来建立OLE 复合文档,它的声明在
ActiveX单元中。函数的原形是:
function StgCreateDocfile(pwcsName:PoleStr;grfMode:Longint;reserved:Longint;out stgOpen:IStorage):Hresult;stdcall;
,函数返回的存储是复合文档的根目录存储。具体参数如下:
(1) wcsName:被创建的文件名称;
(2) grfMode:复合文档的操作方式,各个选值的含义如表1所示:
(3) reserved:必须设置为0;
(4) stgOpen:返回一个存储;

//grfMode参数意义如下:
STGM_READ 只读模式
STGM_WRITE 只写模式
STGM_READWRITE 读写模式
STGM_SHARE_DENY_NONE 共享存取模式
STGM_SHARE_DENY_READ 禁止共享的读模式
STGM_SHARE_DENY_WRITE 禁止共享的写模式
STGM_SHARE_EXCLUSIVE 独占的存取模式
STGM_DIRECT 对复合文档的所有修改立即生效
STGM_TRANSACTED 提交时所有修改才被保存到复合文档中
STGM_FAILIFTHERE 若已存在一个流或存储,则创建复合文档失败
STGM_CREATE 若已存在一个流或存储,则它将被覆盖,否则将创建一个新的流或存储
STGM_DELETEONRELEASE 当这个复合文档中的流或存储被释放时,它也会自动被释放

2.3 OLE复合文档的打开
可以使用Windows SDK 函数StgOpenStorage 来打开一个OLE 复合文档,它的声明在
ActiveX单元中。函数的原形是:
function StgOpenStorage(pwcsName: PoleStr;stgPriority:Istorage;
grfMode:Longint;snbExclude:TSNB;
reserved:Longint;out stgOpen:IStorage):Hresult;stdcall;

,这里的snbExclude选取nil,其它参数参见StgCreateDocFile()。

2.4 流的建立及数据的写入
打开一个OLE 复合文档后,可用IStorage 接口的CreateStream 函数在该文档中创建一
个流,然后充分利用Delphi强大的流机制与基于OLE的各种应用程序的数据进行信息交换。
例如,用户可以使用Delphi下的OleContainer 控件中加载一个支持OLE 应用程序的数据,
然后调用该控件下的SaveToStream()方法把信息以流的形式写进复合文档。CreateStream 函
数的原形是:
function CreateStream(pwcsName:PoleStr;grfMode:Longint;
reserved1:Longint;reserved2:Longint;
out stm:IStream):Hresult;stdcal;

,其中,pwcsName是指新建流的名称,reserved1、reserved2两参数的值均置为0,其它参数参见StgCreateDocFile()。

2.5 OLE复合文档的存储
如上所述,OLE 复合文档的存储与文件系统的“文件夹”在概念上相似的,它也有着
建立、打开和删除等操作。其中使用IStorage 接口的CreateStorage()、OpenStorage()函数可
以分别建立或打开一个子存储。它们的原形分别是:
function CreateStorage(pwcsName:PoleStr; grfMode: Longint;
dwStgFmt: Longint; reserved2: Longint; out stg: IStorage): Hresult;stdcall;
function OpenStorage(pwcsName: PoleStr; const stgPriority: Istorage;
grfMode:Longint; snbExclude: TSNB; reserved: Longint;
out stg: IStorage): Hresult; stdcall;,它们的参数与上述类同,具体用法
见源代码部分。

2.6 存储和流的删除
使用IStorage接口的DestroyElement()函数可以删除OLE复合文档的存储或流,它的函
数原形是:
function DestroyElement(pwcsName:POleStr):Hresult;stdcall;
,其中,pwcsName参数是指被删除的存储或流的名称。应该指出的是,在删除复合文档的存储或流时,调用
DestroyElement()函数的接口应是被删除的存储或流的上一层存储。如图1 中,若想删除
“Customer”流,则正确的语句是:DataBase·DestroyElement('Customer');而要删
除“DataBase” 存储时,则应使用RootStorage·DestroyElement('DataBase'),其中
RootStorage是根目录存储。此外,当一个流或存储被删除时,它的数据并没有被物理删除,
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式