【正文】
LPCOLESTR lpszItem, IMoniker **ppmk)。 p U n k )p Un k 指向文件對(duì)象的 Item 1 對(duì)象的 Item 2 對(duì)象的 I Un k n o w n 接口指針綁定方向方向構(gòu)造IOleItemContainer接口 COM名字對(duì)象分類 ? COM提供的系統(tǒng)名字對(duì)象 ? URL名字對(duì)象 ?自定義名字對(duì)象 系統(tǒng)名字對(duì)象 ? 文件名字對(duì)象 (File Moniker) WINOLEAPI CreateFileMoniker(LPCOLESTR lpszPathName, IMoniker **ppmk)。 p F il e Ob j )創(chuàng)建文件對(duì)象并返回其 IOleIte m Co n tain e r 接口指針p F il e Ob j 指向文件對(duì)象的 IOleIte m Co n tain e r 接口指針p F il e Ob j G e tOb jec t(. .. , I ID_ I Ole Item Co n tain e r , amp。p Item 1 Ob j)p m k F il e Ite m 1 被拆分成 p m k F il e 和 p m lIt e m 1 兩部分p m k Ite m 1 Bin d T o Ob jec t( … , p m k F il e , IID_ I Ole Item Co n tain e r , amp。 pmkRight : pmkLeft,最右邊部分分離 – ( 3) 調(diào)用 pmkRightBindToObject(...,pmkLeft, ...) – ( 4)執(zhí)行 pmkRightBindToObject ? 如果 pmkLeft為簡(jiǎn)單名字對(duì)象,則可終止循環(huán) ? 否則, pmkRight往往要調(diào)用 pmkLeftBindToObject,從而形成自右向左的循環(huán)綁定過程 ? 舉例: File!Item1!Item2 File!Item1!Item2的綁定和構(gòu)造過程 p m k Ite m 2 Bin d T o Ob jec t( … , p m k F il e Ite m 1 , IID_ IUn k n o w n , p p v Ob j)客戶程序調(diào)用 p Co m p Bin d T o Ob jec t( … , IID_ IUn k n o w n , amp。 ?顯示名分隔符: “ ! ” 、 “ \”、 “ /”、“ :”或 “ [” 復(fù)合名字對(duì)象 ?通用復(fù)合名字對(duì)象 HRESULT CreateGenericComposite(IMoniker *pmkFirst, IMoniker *pmkRest, IMoniker **ppmkComposite)。 名字解析 HRESULT GetDisplayName(IBindContext *pbc, IMoniker *pmkToLeft, LPOLESTR *ppszDisplayName)。 HRESULT Reduce (IBindContext *pbc, DWORD dwReduceHowFar, IMoniker **ppmkToLeft, IMoniker **ppmkReduced)。 HRESULT RelativePathTo(IMoniker *pmkOther, IMoniker **ppmkRelPath)。 HRESULT IsSystemMoniker(DWORD *pdwMksys)。 前綴 !綁定方向名字對(duì)象 ! 后綴構(gòu)造方向復(fù)合名字對(duì)象的管理 HRESULT Enum(BOOL fForward, IEnumMoniker **ppEnum)。 IMoniker綁定 HRESULT BindToObject(IBindContext *pbc, IMoniker *pmkToLeft, REFIID riid, void **ppvObj)。 HRESULT IsRunning(IBindContext *pbc, IMoniker *pmkToLeft, IMoniker *pmkNewlyRunning)。 與 CLSID的聯(lián)系 ? IStorage::SetClass函數(shù)把存儲(chǔ)對(duì)象與 CLSID聯(lián)系起來 ? GetClassFile函數(shù),從文件到 CLSID: 復(fù)合文件,直接得到根存儲(chǔ)的 CLSID 非復(fù)合文件: (1) 文件擴(kuò)展名 〉 ProgID〉 CLSID (2) HKEY_CLASSES_ROOT\FileType鍵提供了匹配規(guī)則: HKEY_CLASSES_ROOT FileType {clsid } type id = offset,cb,mask,value type id = offset,cb,mask,value 復(fù)合文檔與 COM的關(guān)系 ? 復(fù)合文檔技術(shù)以 COM為基礎(chǔ) ? 應(yīng)用程序在處理復(fù)合文檔時(shí) – 把 storage或 stream直接交給 COM組件來處理 – COM組件接受 storage或 stream作為數(shù)據(jù)存儲(chǔ) – 多個(gè)組件協(xié)同處理同一個(gè)文件 ? 永久對(duì)象 永久對(duì)象 ? 永久對(duì)象 – 實(shí)現(xiàn)了 IPersistXXX接口的 COM對(duì)象 ? 永久接口: – class IPersist : public IUnknown – class IPersistStream : public IPersist – class IPersistStreamInit : public IPersist – class IPersistFile : public IPersist – class IPersistStorage : public Ipersist ? 永久接口的成員函數(shù): – GetClassID、 IsDirty、 Load和 Save, … ... ? 永久對(duì)象可以實(shí)現(xiàn)多個(gè)永久接口,但使用時(shí)要保持一致性 永久對(duì)象用法 ?永久對(duì)象與結(jié)構(gòu)化存儲(chǔ)模型結(jié)合 ?永久對(duì)象例子 –用 MFC實(shí)現(xiàn)的 COM對(duì)象 –功能:永久狀態(tài)為一段文本,使用永久接口對(duì)文本維護(hù) –實(shí)現(xiàn)了 IPersistStream和一個(gè)自動(dòng)化接口 復(fù)合文檔例子 復(fù)合文檔查看工具 命名和綁定技術(shù) (moniker) ?名字技術(shù)基礎(chǔ) ? IMoniker接口 ?復(fù)合名字對(duì)象 ? COM名字對(duì)象分類和應(yīng)用 名字技術(shù)基礎(chǔ) ? Moniker:名字對(duì)象 (也是 COM對(duì)象 )為組件對(duì)象提供了符號(hào)化的表示方法 ? 命名 – 名字空間 ? 綁定: – 對(duì)象的狀態(tài):激活狀態(tài)或者運(yùn)行狀態(tài)、被動(dòng)狀態(tài) – 綁定:使對(duì)象從被動(dòng)態(tài)自動(dòng)進(jìn)入運(yùn)行態(tài) —— 激活、連接 – 所以也被稱為 “ 永久智能對(duì)象 ” 名字對(duì)象的作用 類廠 客戶 IClassFactory COM對(duì)象 ( 1) 客戶 COM對(duì)象 moniker IMoniker ( 2) 概念: COM名字對(duì)象 ? 名字對(duì)象與文件名的比較 – 名字對(duì)象表達(dá)的是 對(duì)象 ——智能啟動(dòng) – 文件名表達(dá)的是文件 ? 名字對(duì)象封裝了組件對(duì)象的狀態(tài)處理 – 封裝性帶來了一致性和多態(tài)性 – 標(biāo)準(zhǔn)接口 IMoniker ? 客戶通過名字對(duì)象建立與 對(duì)象的連接 – 名字對(duì)象是客戶與對(duì)象之間的橋梁 名字路徑名字對(duì)象類型C: \ M y Do c u m e n ts\ M y Do c . x ls文件名字對(duì)象( F il e M o n ik e r )!T A B L E 1單項(xiàng)名字對(duì)象(Item M o n ik e r)!R1 C1 :R 2 C2單項(xiàng)名字對(duì)象(Item M o n ik e r)復(fù)合名字對(duì)象使用名字對(duì)象:綁定過程 ? 客戶創(chuàng)建名字對(duì)象 – API函數(shù),如 CreateFileMonik