复合名字对象 ·通用复合名字对象 HRESULT Create Generic Composite(MOniker pmkFirst MOniker *pmkRest, MOniker **ppmk Composite) 按从左到右的顺序组合,满足结合律 举例:文档内部的电子表格
:% # !, $ !$ !!() ;<=>?0@A) BC D EF GHIJ0KL1M
ROT表 COM使用ROT表管理当前系统中正在运行的、已 经被注册的名字对象 class IRunningObjectTable: public IUnknown virtual HRESULT Register(DWORD grfFlags, IUnknown *pUnkObject MOniker "pmkObject, DWORD* pdwRegister)=0 virtual HRESULT Revoke(d WoRd dwRegister)=0 virtual HRESULT IsRunning(MOniker pmkObject)=0; virtual HRESULT GetObject(MOniker pmkObject, IUnknown**ppUnkObject)=0 virtual HRESULT Note Change Time(DWORD dw Register, FILETIME pft)=0 virtual HRESULT GetTimeOfLastChange(MOniker pmkObject, FILETIME*pft)=0 virtual HRESULT EnumRunning(IEnumMoniker *"pp Enum)=0 客户调用 GetRunning Object table函数访问ROT表
! #$ %&'()*+,-./ 0 1234 ! "#$ % $ & %' $ ! %( )*+, ! ( )*+, & %' )*+, - & %' $ %% )*+, ./0 ' ! ( $#&%")*+, - '"/0 & %' $#&%")*+, ' '& %% ')*+, 1, 5$ 6789 %
绑定环境对象 也是COM实现的系统对象 WINOLEAPI Create BindCtx (DWORD reserved, IBindCtxppbc class IBindCtx: public IUnknown virtual HRESULT RegisterObject Bound(IUnknown punk)=0; virtual HRESULT RevokeObjectBound(IUnknown "punk)=0 virtual HRESULT Release boundobjectso=0 virtual HRESULT SetBindOptions(BIND OPTS pbindopts)=0 virtual HRESULT GetBindOptionS(BIND OPTS *pbindopts)=0 virtual HRESULT GetRunningObjectTable(IRunningObjectTable*pprot)=0; virtual HRESULT RegisterObjectParam(LPOLESTR pSzKey, IUnknown" punk )=0; virtual HRESULT GetObjectParam(LPOLESTR pszKey, IUnknown**ppunk)=0; virtual HRESULT EnumObjectParam(IEnumString*ppenum)=0; virtual HRESULT RevokeObjectParam(LPOLESTR pszKey =0
"# :;<=)* '/"93 (+&'"& 2(-(+ ,$% (+@ , ) A 2 * ",1() $78% 2 2",1() $78% 2 (",1 $78% 2 (" /&6"3 ,( $78% 2 0(" /&6"3 ,( $78% 2 0*",1, *",1, $78% 2 * ",13 !3" B4-) $78% 2 0",13 !3" B4-) $78% 2 !",13 !! * !$78% 2 2",13 !3" B4$78% C%
绑定环境对象(续) 管理已被绑定的对象: Register ObjectBound RevokeObjectBound Release boundobjects ·管理绑定参数:(文件访问模式、超时设置等) SetBindOptions, GetBindOptions 管理绑定过程中的对象参数: RegisterobjectParam, GetObjectParam EnumObjectParam, RevokeObjectParam
"# $ &02 ' ( ' ) ' ( ( &>7 89?@ ABCDE " ( * ( &F+>7 ' ( * + ' )
复合名字对象绑定过程的剖析 MOniker: BindToobject绑定过程: (1)检查ROT表。 2)分解。 pmkRight: pmkLeft,最右边部分分离 (3)调用 pmkRight> BindToobject((., pmkLeft,) (4)执行 pmkRight-> BindToobject 如果 pmkLeft为简单名字对象,则可终止循环 否则, pmkright往往要调用 pmkLeft-> BindToobject,从而 形成自右向左的循环绑定过程。 举例:File!teml!tem2
% F - . BC' & , DE ' -. FGHIDDJ / @A' -01 23334. 43335 6 K' -01 / % / 0*%12"3# !"#$% !"