【正文】
遠程機器上 ? DCOM的連接管理 ? DCOM并發(fā)性管理 ? DCOM安全性 DCOM組件對象的創(chuàng)建過程 客戶 組件CO M 庫(OL E 3 2 . DL L )S CM(RP C S S . E X E )S CM(RP C S S . E X E )RP C調(diào)用創(chuàng)建函數(shù)遠程創(chuàng)建創(chuàng)建進程和對象對象激活 (activation) ? 對象激活: – 創(chuàng)建新的組件對象 ——類廠對象 – 建立已有組件對象與客戶之間的連接 ——名字對象 ? 遠程對象的創(chuàng)建: – 標識一個遠程對象: CLSID+RemoteServerName ? 如何獲取 RemoteServerName 信息 – DCOM配置工具指定遠程服務器名 – 客戶程序在代碼中顯式指定遠程服務器名 創(chuàng)建 DCOM組件 (一 ) ? 位置透明性:客戶程序不必知道組件運行在本地或遠程機器上 ? RemoteServerName信息: HKEY_CLASSES_ROOT\APPID\{appidguid} “RemoteServerName”=“DNS name” HKEY_CLASSES_ROOT\CLSID\{clasidguid} “AppID”=“appidguid ” ? RemoteServerName信息不能被傳遞 ? 客戶創(chuàng)建組件對象的代碼不必修改 使用 DCOM配置工具配置組件的 RemoteServerName信息 創(chuàng)建 DCOM組件 (二 ) ? 在 CoGetClassObject和 CoCreateInstanceEx函數(shù)中指定服務器信息 typedef struct _COSERVERINFO { DWORD dwReserved1。 ? Windows的版本: – NT Windows 95 + DCOM擴展 ? MTA套間中的對象必須 threadsafe – 被 MTA中線程創(chuàng)建的對象為 MTA對象 – MTA中的線程都可以直接訪問 MTA對象 – 使用 Win32多線程編程技術保證 threadsafe MTA接收調(diào)用示意圖 MTA 調(diào)用 stub stub MTA線程 RPC線程 MTA中線程的特點 ? 使用 CoInitializeEx(NULL, COINIT_MULTITHREADED)初始化 ? 若客戶與對象都在 MTA中,則調(diào)用直接在客戶線程中執(zhí)行 ? 若客戶程序在另一個進程中,則調(diào)用通過 proxy/stub,直接在 RPC線程上執(zhí)行 ? 若客戶在 STA中,則調(diào)用通過 proxy/stub,直接在RPC線程上執(zhí)行 ? 沒有隱藏窗口, MTA線程創(chuàng)建的對象并沒有生存在任何特定的線程中,而是生存在 MTA中 ? MTA對象必須是線程安全的,允許重入 MTA線程要點 ? MTA線程中的客戶調(diào)用 STA對象或其他進程中的對象 – 客戶調(diào)用代理對象,代理對象又調(diào)用 RPC通道,RPC通道阻 塞 客戶線程,如果客戶線程中有窗口的話,則會被鎖住 ? 調(diào)用進入 MTA線程中的對象 – RPC通道直接使用 RPC線程,并調(diào)用存根代碼,存根再調(diào)用組件對象。 – 調(diào)用首先到達一個 RPC線程, RPC線程向套間線程隱藏窗口發(fā)送消息,并把列集數(shù)據(jù)傳過去 套間線程:典型情形 ? 客戶創(chuàng)建套間線程,然后套間線程的主函數(shù)創(chuàng)建 COM對象,套間線程再調(diào)用CoMarshalInterThreadInterfaceInStream函數(shù),把接口指針列集到流對象中,然后通知客戶線程對象已經(jīng)創(chuàng)建成功,客戶線程接到通知后,利用流對象指針把對象的接口指針散集出來,以后客戶線程就可以與對象通訊了。 ? 在線程結(jié)束之前,調(diào)用 CoUninitialize結(jié)束套間 ? 套間線程包含消息循環(huán) ? COM在套間線程中創(chuàng)建了一個隱藏的窗口 – 用途:同步、分發(fā)消息 STA套間 (續(xù) ) ? 在 STA中創(chuàng)建的 COM對象都屬于這個 STA ? STA對象不必處理同步,因為對象的方法代碼只能被這個 STA套間的線程調(diào)用 ? 但 DLL程序的引出函數(shù)如 DllGetClassObject和 DllCanUnloadNow等仍需同步處理。COM多線程模型、 DCOM 潘愛民 內(nèi)容 ? 復習: COM聚合和 COM跨進程模型 ? COM線程模型 ? 分布式 COM(DCOM) – DCOM基本結(jié)構 – 對象激活 – 連接管理 – 并發(fā)管理 – DCOM安全模型 復習: 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復習:聚合 ? 支持聚合的對象在非聚合方式下的接口示意圖 復習:聚合 對象 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)化技術 – marshalbyvalue 標準列集的 proxy和 stub結(jié)構 客戶進程 代理