簡體   English   中英

進程外COM服務器 - 函數調用和線程

[英]Out of Process COM Server - function calls and threads

當你有一個進程外的COM服務器,你從客戶端內的線程X從這個服務器內的客戶端調用一個函數,然后如何在COM服務器中執行此函數?

在它當前正在執行的線程中,還是在其主線程上?

觀察到正常的COM公寓線程規則。 如果對象是由STA公寓中的客戶端創建的,則客戶端線程需要使用封送的接口指針,否則它將獲得RPC_E_WRONG_THREAD。 實際的方法調用將在其STA線程中的服務器上執行,它需要為此工作提供一個消息循環。 執行是序列化的,不需要鎖定。

如果它存在於MTA公寓中,那么方法調用將在任意RPC工作線程上執行。 而且你需要采取通常的線程預防措施。

線程不會從進程跳轉到進程。

在COM服務器內部,COM偵聽傳入的方法調用,並具有一個線程池(特定於此進程)來為請求提供服務。

請參閱對象間通信代理存根

客戶端始終在某個進程內對象中調用接口方法。 如果實際對象是本地對象或遠程對象,則調用代理對象,然后對實際對象進行遠程過程調用。

那么實際執行的方法是什么? 答案是每當調用進程外接口時,每個接口方法都由代理對象實現。 代理對象始終是進程內對象,代表被調用的對象。 此代理對象知道實際對象正在本地或遠程服務器中運行。

代理對象將某些數據包中的函數參數打包,並生成對本地或遠程對象的RPC調用。 該數據包由本地或遠程計算機上服務器進程中的存根對象獲取,該存根對象解壓縮參數並調用該方法的實際實現。 當該函數返回時,存根將所有out參數和返回值打包並將其發送回代理,代理將其解包並將它們返回給原始客戶端。

因此,客戶端和服務器總是相互通信,好像一切都在進行中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM