【正文】
DWORD dwCapabilities。 LPWSTR pwszServerPrincName。 ? 返回值: – PENDINGMSG_CANCELCALL 取消當前調(diào)用 – PENDINGMSG_WAITNOPROCESS 客戶不處理消息 – PENDINGMSG_WAITDEFPROCESS 處理部分消息, 丟掉其他消息 DCOM安全模型 ? Windows NT安全機制 ? 激活安全性 ? 調(diào)用安全性 ? 運行時刻動態(tài)設(shè)置安全性 ? 安全性配置 Windows NT安全模型概念 ? domain、 user和 user group ? authentication,認證 ? security identifier, SID ? security description, SD ? Access Control List, ACL Windows NT安全模型 ? 用戶和資源管理 – 認證用戶的身份 – SID描述用戶 – SD描述資源的安全性 ? SSP(Security Support Providers) – SSPI 激發(fā)安全性 (launching security) ? 由 SCM來控制。 }。 } } 用分派服務(wù)組件對象 實現(xiàn)動態(tài)負載平衡功能 ② p A Cre a teO b jec tB客戶機名字開放服務(wù)器服務(wù)器 1服務(wù)器 2服務(wù)器 3① 請求創(chuàng)建對象 A③選擇服務(wù)器 3并創(chuàng)建對象 B④返回對象 B⑥客戶直接與對象 B 連接⑤釋放 對象 A遠程創(chuàng)建進程內(nèi)組件:代理進程 (Surrogate) ? 代理進程優(yōu)點: – 進程內(nèi)組件程序中的嚴重錯誤只影響到代理進程,不會使客戶進程崩潰; – 一個代理進程可以同時為多個客戶提供服務(wù); – 在代理進程中運行進程內(nèi)服務(wù)可使 DLL享有代理進程的安全性。mqi)。 COSERVERINFO srvinfo = {0, NULL, NULL, 0}。 HRESULT hr。 DWORD dwReserved2。這中間沒有線程切換。 ? 類廠是否需要線程安全,取決于類廠的策略 ? 如何把接口指針交給調(diào)用者 – 自動 marshaling – 手工 marshaling STA接收調(diào)用示意圖 STA 消息 隱藏窗口 分發(fā)消息 stub stub STA套間傳遞接口指針 ? 通過 COM傳遞的接口指針, COM都會自動 marshaling ? 手工 marshaling – CoMarshalInterface和CoUnmarshalInterface – CoMarshalInterThreadInterfaceInStream和 CoGetInterfaceAndReleaseStream 套間線程要點 ? STA客戶調(diào)用 STA對象的過程 – RPC通道,通過消息傳遞調(diào)用, RPC通道發(fā)出消息后,調(diào)用 MsgWaitForMultipleObjects阻塞調(diào)用方,但仍然分發(fā)消息,所以 UI仍是活的 ? STA客戶跨進程調(diào)用的過程 – 代理對象先得到一個 RPC線程,并把列集后的數(shù)據(jù)包交給它, RPC線程又生成輔助線程,由它負責跨進程調(diào)用, RPC線程也負責分發(fā)消息,所以 UI也是活的 ? 從另一個進程進入套間線程的過程。COM多線程模型、 DCOM 潘愛民 內(nèi)容 ? 復(fù)習: COM聚合和 COM跨進程模型 ? COM線程模型 ? 分布式 COM(DCOM) – DCOM基本結(jié)構(gòu) – 對象激活 – 連接管理 – 并發(fā)管理 – DCOM安全模型 復(fù)習: COM包容模型 對象 BIS o m e In te rfa c e對象 AIS o m e In te rfa c e客戶程序調(diào)用調(diào)用IO th e rIn te rf a c e對象 AIS o m eIn terface客戶程序 Q u ery In ter f a ceA d d R efR elea seS o m eF u n ctio n委托IU n k n o w n非委托IU n k n o w n復(fù)習:聚合 ? 支持聚合的對象在非聚合方式下的接口示意圖 復(fù)習:聚合 對象 BIO th e rIn te rf a c e對象 AIS o m e In te rfa c e客戶程序Q u e ry In te r f a c eA d d Re fRe le a seS o m e F u n c tio nQ u e ry In te r f a c eA d d Re fRe le a seO th e rF u n c tio n外部對象的IU n k n o w n委托IU n k n o w n非委托IU n k n o w n控制? 支持聚合的對象在聚合方式下的接口示意圖 通過類廠建立代理對象和組件對象自定義列集過程 自定義列集的要點 ? 對象必須實現(xiàn) IMarshal接口 ? 代理對象也必須實現(xiàn) IMarshal接口,并且代理對象與進程外對象之間協(xié)作 ? 代理對象必須負責所有接口的跨進程操作 ? 典型用途: – 提高跨進程調(diào)用的效率,使用緩存狀態(tài)等優(yōu)化技術(shù) – marshalbyvalue 標準列集的 proxy和 stub結(jié)構(gòu) 客戶進程 代理對象組件進程IT F 1客戶程序IT F 2IT F n代理管理器IRp c Ch a n n e lB u f f e r系統(tǒng) R P C組件對象 存根代碼IT F 1IT F 2IT F n存根管理器系統(tǒng) R P CIRp c P ro x y Bu f f e rIRp c S tu b Bu f f e rRP C 通道RP C 通道進程外組件注意事項 ? 自注冊方式的變化 – 命令行參數(shù) /RegServer和 /UnregServer ? 注冊類廠 ? 何時被卸載 ? 調(diào)用 CoInitialize和 CoUninitialize ? 實現(xiàn)自定義接口的代理 /存根組件