呼叫同步處理

COM 應用程式必須能夠正確處理使用者輸入,同時處理來自 COM 或作業系統的一或多個呼叫。 COM 僅提供單個線程 Apartment 的呼叫同步處理。 多線程 Apartment(包含自由線程線程)在進行呼叫時(在同一個線程上)不會接聽呼叫。 多線程 Apartment 無法進行輸入同步呼叫。 異步呼叫會轉換成多線程 Apartment 中的同步呼叫。 訊息篩選不會針對多線程 Apartment 中的任何線程呼叫。 如需線程問題的詳細資訊,請參閱進程、線程和 Apartment。

進程之間的 COM 呼叫分為三個類別,如下所示:

同步呼叫

COM 中發生的大部分通訊都是同步的。 進行同步呼叫時,呼叫端會先等候回復,再繼續,而且可以在等候時接收傳入訊息。 COM 會輸入強制回應迴圈,以受控制的方式等候回復、接收和分派其他訊息。

異步通知

傳送異步通知時,呼叫端不會等候回復。 COM 會根據平臺使用 PostMessage 或高階事件來傳送異步通知。 COM 定義 IAdviseSink 的五個異步方法:

注意

雖然 COM 正在處理異步呼叫,但無法進行同步呼叫。 例如,容器應用程式的 OnDataChange作不能包含 IPersist 的呼叫 儲存體::Save。 這些呼叫是 COM 唯一支援的異步呼叫。 目前無法建立異步的自定義介面。

 

輸入同步處理的呼叫

進行輸入同步呼叫時,呼叫的對象必須先完成呼叫,才能產生控件。 這有助於確保焦點管理正常運作,並適當地處理使用者輸入的數據。 COM 會透過 SendMessage 函式進行這些呼叫,而不需要輸入強制回應迴圈。 處理輸入同步呼叫時,呼叫的物件不得呼叫任何可能產生控制權的函式或方法(包括同步方法)。 下列方法是同步處理的輸入

若要將異步訊息處理所產生的問題降到最低,大部分的 COM 方法呼叫都是同步的。 使用同步通訊時,不需要特殊程式代碼來分派和處理傳入訊息。 當應用程式進行同步方法呼叫時,COM 會輸入強制回應等候迴圈,以處理必要的回復,並將傳入訊息分派給能夠處理這些回復的應用程式。

COM 會藉由指派稱為邏輯線程標識碼標識碼來管理方法呼叫。 當使用者選取功能表命令或應用程式起始新的 COM 作業時,就會指派新的命令。 與初始 COM 呼叫相關的後續呼叫會指派與初始呼叫相同的邏輯線程標識碼。