(精品)11COM的扩展复合文档命名统一数据传输.ppt
《(精品)11COM的扩展复合文档命名统一数据传输.ppt》由会员分享,可在线阅读,更多相关《(精品)11COM的扩展复合文档命名统一数据传输.ppt(74页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、COM的扩展潘爱民2003-11-21http:/ storage):由来l文件系统的诞生文件系统的诞生多个应用程序共享同一个存储设备多个应用程序共享同一个存储设备文件服务功能的抽象文件服务功能的抽象l进展到结构化存储进展到结构化存储多个组件共享同一个文件多个组件共享同一个文件组件软件存储功能的基本要求组件软件存储功能的基本要求OLE的需求的需求组件共享句柄方案,如何定位?避免冲突?组件共享句柄方案,如何定位?避免冲突?文件系统结构结构化存储多个组件程序共享一个复合文件复合文件l文件内部的文件系统文件内部的文件系统l只有两种对象:存储对象和流对象只有两种对象:存储对象和流对象l实现了部分访问和
2、增量访问的功能实现了部分访问和增量访问的功能流对象lCOM库提供实现,实现了库提供实现,实现了IStream接口接口class IStream:public IUnknownpublic:virtual HRESULT Read(void*pv,unsigned long cb,unsigned long*pcbRead)=0;virtual HRESULT Write(void*pv,unsigned long cb,unsigned long*pcbWritten)=0;virtual HRESULT Seek(LARGE_INTEGER dlibMove,unsigned long dw
3、Origin,ULARGE_INTEGER*plibNewPosition)=0;virtual HRESULT SetSize(ULARGE_INTEGER libNewSize)=0;virtual HRESULT CopyTo(LPSTREAM pStm,ULARGE_INTEGER cb,ULARGE_INTEGER*pcbRead,ULARGE_INTEGER*pcbWritten)=0;virtual HRESULT Commit(unsigned long dwCommitFlags)=0;virtual HRESULT Revert()=0;virtual HRESULT Lo
4、ckRegion(ULARGE_INTEGER libOffset,ULARGE_INTEGER cb,unsigned long dwLockType)=0;virtual HRESULT UnlockRegion(ULARGE_INTEGER libOffset,ULARGE_INTEGER cb,unsigned long dwLockType)=0;virtual HRESULT Stat(STATSTG*pStatStg,unsigned long grfStatFlag)=0;virtual HRESULT Clone(LPSTREAM*ppStm)=0;存储对象lCOM库提供实现
5、,实现了库提供实现,实现了IStorage接口接口class IStorage:public IUnknownvirtual HRESULT CreateStream(const WCHAR*,unsigned long,LPSTREAM*)=0;virtual HRESULT OpenStream(const WCHAR*,unsigned long,LPSTREAM*)=0;virtual HRESULT CreateStorage(const WCHAR*,unsigned long,LPSTORAGE*)=0;virtual HRESULT OpenStorage(const WCHA
6、R*,LPSTORAGE *,unsigned long,SNB,unsigned long,LPSTORAGE*)=0;virtual HRESULT CopyTo(unsigned long,IID const*,SNB snbExclude,LPSTORAGE*pStgDest)=0;virtual HRESULT MoveElementTo(const WCHAR*,LPSTORAGE *,char const*,unsigned long)=0;virtual HRESULT Commit(unsigned long)=0;virtual HRESULT Revert()=0;vir
7、tual HRESULT EnumElements(unsigned long,void*,unsigned long,LPENUMSTATSTG*)=0;virtual HRESULT DestroyElement(const WCHAR*pwcsName)=0;virtual HRESULT RenameElement(const WCHAR*pwcsOldName,const WCHAR*pwcsNewName)=0;virtual HRESULT SetElementTimes(const WCHAR*,FILETIME const*,FILETIME const*,FILETIME
8、const*)=0;virtual HRESULT SetClass(REFCLSID rclsid)=0;virtual HRESULT SetStateBits(unsigned long grfStateBits,unsigned long grfMask)=0;virtual HRESULT Stat(STATSTG*pStatStg,unsigned long grfStatFlag)=0;客户如何获取存储对象和流对象l如何得到指向根存储对象的接口指针?如何得到指向根存储对象的接口指针?lCreateStorage和和OpenStorage成员函成员函数得到一个子存储对象,是唯一的途
9、径数得到一个子存储对象,是唯一的途径lCreateStream和和OpenStream成员函数成员函数得到一个流对象,也是唯一的途径得到一个流对象,也是唯一的途径用结构化存储设计应用(一)l用普通文件组织的文档结构用普通文件组织的文档结构用结构化存储设计应用(二)l复合文件格式的文档结构复合文件格式的文档结构复合文档l结构化存储的具体实现结构化存储的具体实现l底层机制:底层机制:LockBytes对象对象把存储介质描述成一般化的字节序列把存储介质描述成一般化的字节序列l复合文档复合文档API函数函数l零内存保存特性零内存保存特性LockBytes复合文档模型rootDisk其他MemoryLo
10、ckBytes对象lILockBytes接口接口class ILockBytes:public IUnknownpublic:virtual HRESULT ReadAt(ULARGE_INTEGER,VOID*pv,unsigned long,unsigned long*)=0;virtual HRESULT WriteAt(ULARGE_INTEGER,VOID*pv,unsigned long,unsigned long*)=0;virtual HRESULT Flush()=0;virtual HRESULT SetSize(ULARGE_INTEGER cb)=0;virtual H
11、RESULT LockRegion(ULARGE_INTEGER,ULARGE_INTEGER,unsigned long)=0;virtual HRESULT UnlockRegion(ULARGE_INTEGER,ULARGE_INTEGER,unsigned long)=0;virtual HRESULT Stat(STATSTG*,unsigned long)=0;复合文档API函数l创建复合文档的创建复合文档的API函数函数StgCreateDocfile、StgCreateDocfileOnILockBytesl打开复合文档的打开复合文档的API函数函数StgOpenStorage
12、、StgOpenStorageOnILockBytesl与内存句柄有关的一组操作函数与内存句柄有关的一组操作函数CreateILockBytesOnHGlobal、GetHGlobalFromILockBytesCreateStreamOnHGlobal、GetHGlobalFromStreaml其他其他零内存保存特性l意义:资源耗尽之后,保留修改信息意义:资源耗尽之后,保留修改信息l资源预留,对于所有的流对象和存储对象资源预留,对于所有的流对象和存储对象l“Save”操作,只要调用操作,只要调用Commit函数即可函数即可l“Save As”操作,利用根存储对象上的操作,利用根存储对象上的I
13、RootStorage接口,调用接口,调用SwitchToFile成员函成员函数,再调用数,再调用Commit函数即可。函数即可。与CLSID的联系lIStorage:SetClass函数把存储对象与函数把存储对象与CLSID联系起来联系起来lGetClassFile函数,从文件到函数,从文件到CLSID:复合文件,直接得到根存储的复合文件,直接得到根存储的CLSID非复合文件:非复合文件:(1)文件扩展名文件扩展名-ProgID-CLSID(2)HKEY_CLASSES_ROOTFileType键提供了匹配规则:键提供了匹配规则:HKEY_CLASSES_ROOT FileType =,=,
14、复合文档与COM的关系l复合文档技术以复合文档技术以COM为基础为基础l应用程序在处理复合文档时应用程序在处理复合文档时把把storage或或stream直接交给直接交给COM组件来处理组件来处理COM组件接受组件接受storage或或stream作为数据存储作为数据存储多个组件协同处理同一个文件多个组件协同处理同一个文件l-永久对象永久对象永久对象l永久对象永久对象实现了实现了IPersistXXX接口的接口的COM对象对象l永久接口:永久接口:class IPersist:public IUnknownclass IPersistStream:public IPersistclass IP
15、ersistStreamInit:public IPersistclass IPersistFile:public IPersistclass IPersistStorage:public Ipersistl永久接口的成员函数:永久接口的成员函数:GetClassID、IsDirty、Load和和Save,.l永久对象可以实现多个永久接口,但使用时要保持一永久对象可以实现多个永久接口,但使用时要保持一致性致性永久对象用法l永久对象与结构化存储模型结合永久对象与结构化存储模型结合l永久对象例子永久对象例子用用MFC实现的实现的COM对象对象功能:永久状态为一段文本,使用永久接口功能:永久状态为一
16、段文本,使用永久接口对文本维护对文本维护实现了实现了IPersistStream和一个自动化接口和一个自动化接口复合文档例子复合文档查看工具命名和绑定技术(moniker)l名字技术基础名字技术基础lIMoniker接口接口l复合名字对象复合名字对象lCOM名字对象分类和应用名字对象分类和应用名字技术基础lMoniker:名字对象名字对象(也是也是COM对象对象)为组件对为组件对象提供了符号化的表示方法象提供了符号化的表示方法l命名命名名字空间名字空间l绑定:绑定:对象的状态:激活状态或者运行状态、被动状态对象的状态:激活状态或者运行状态、被动状态绑定:使对象从被动态自动进入运行态绑定:使对象
17、从被动态自动进入运行态 激活、激活、连接连接所以也被称为所以也被称为“永久智能对象永久智能对象”名字对象的作用类厂客户IClassFactoryCOM对象(1)客户COM对象monikerIMoniker(2)概念:COM名字对象l名字对象与文件名的比较名字对象与文件名的比较名字对象表达的是名字对象表达的是com对象对象智能启动智能启动文件名表达的是文件文件名表达的是文件l名字对象封装了组件对象的状态处理名字对象封装了组件对象的状态处理封装性带来了一致性和多态性封装性带来了一致性和多态性标准接口标准接口IMonikerl客户通过名字对象建立与客户通过名字对象建立与com对象的连接对象的连接名字
18、对象是客户与对象之间的桥梁名字对象是客户与对象之间的桥梁使用名字对象:绑定过程l客户创建名字对象客户创建名字对象API函数,如函数,如CreateFileMoniker l绑定到名字对象所指的对象绑定到名字对象所指的对象调用调用IMoniker:BindToObjectl举例:举例:IMoniker接口名字管理HRESULT IsEqual(IMoniker*pmkOtherMoniker);HRESULT Hash(DWORD*pdwHash);HRESULT IsRunning(IBindContext*pbc,IMoniker*pmkToLeft,IMoniker*pmkNewlyRun
19、ning);HRESULT GetTimeOfLastChange(IBindContext*pbc,IMoniker*pmkToLeft,FILETIME*pFileTime);IMoniker绑定HRESULT BindToObject(IBindContext*pbc,IMoniker*pmkToLeft,REFIID riid,void*ppvObj);HRESULT BindToStorage(IBindContext*pbc,IMoniker*pmkToLeft,REFIID riid,void*ppvObj);复合名字对象的管理HRESULT Enum(BOOL fForward
20、,IEnumMoniker*ppEnum);HRESULT Inverse(IMoniker*ppmk);HRESULT IsSystemMoniker(DWORD*pdwMksys);HRESULT CommonPrefixWith(IMoniker*pmkOther,IMoniker*ppmkPrefix);HRESULT RelativePathTo(IMoniker*pmkOther,IMoniker*ppmkRelPath);HRESULT ComposeWith(IMoniker*pmkRight,BOOL fOnlyIfNotGeneric,IMoniker*ppmkCompos
21、ite);HRESULT Reduce(IBindContext*pbc,DWORD dwReduceHowFar,IMoniker*ppmkToLeft,IMoniker*ppmkReduced);系统名字对象typedef enum tagMKSYS MKSYS_NONE=0,MKSYS_GENERICCOMPOSITE=1,MKSYS_FILEMONIKER=2,MKSYS_ANTIMONIKER=3,MKSYS_ITEMMONIKER=4,MKSYS_POINTERMONIKER=5,MKSYS_URLMONIKER=6,MKSYS_CLASSMONIKER=7,MKSYS_OBJRE
22、FMONIKER=8,MKSYS_SESSIONMONIKER=9 MKSYS;名字解析HRESULT GetDisplayName(IBindContext*pbc,IMoniker*pmkToLeft,LPOLESTR*ppszDisplayName);HRESULT ParseDisplayName(IBindContext*pbc,IMoniker*pmkToLeft,LPOLESTR pszDisplayName,ULONG*pchEaten,IMoniker*ppmkOut);l显显示示名名分分隔隔符符:“!”、“”、“/”、“:”或或“”复合名字对象l通用复合名字对象通用复合名字
23、对象HRESULT CreateGenericComposite(IMoniker*pmkFirst,IMoniker*pmkRest,IMoniker*ppmkComposite);l按从左到右的顺序组合,满足结合律按从左到右的顺序组合,满足结合律l举例:文档内部的电子表格举例:文档内部的电子表格ROT表lCOM使用使用ROT表管理当前系统中正在运行的、表管理当前系统中正在运行的、已经被注册的名字对象已经被注册的名字对象l客户调用客户调用GetRunningObjectTable函数访问函数访问ROT表表绑定环境对象l也是也是COM实现的系统对象实现的系统对象绑定环境对象(续)l管理已被绑定
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 精品 11 COM 扩展 复合 文档 命名 统一 数据传输
限制150内