IMessageFilter 介面 (objidl.h)

為 COM 伺服器和應用程式提供選擇性地處理傳入和傳出 COM 訊息的能力,同時等候來自同步呼叫的回應。 篩選訊息有助於確保呼叫的處理方式可改善效能,並避免死結。 COM 訊息可以是同步、異步或輸入同步處理;大部分的介面呼叫都是同步的。

繼承

IMessageFilter 介面繼承自 IUnknown 介面。 IMessageFilter 也有下列類型的成員:

方法

IMessageFilter 介面具有這些方法。

 
IMessageFilter::HandleInComingCall

提供傳入呼叫的單一進入點。
IMessageFilter::MessagePending

表示 COM 正在等候回應遠端呼叫時,訊息已抵達。
IMessageFilter::RetryRejectedCall

讓應用程式有機會顯示提供重試、取消或工作切換選項的對話方塊。

備註

同步呼叫需要呼叫端等候回復,然後再繼續。 COM 會在等候回復時輸入強制回應迴圈。 在此期間,呼叫端仍能夠接收和分派傳入訊息。

異步呼叫可讓呼叫端繼續,而不需等候來自所呼叫對象的回應。 現在,在 COM 中,唯一的異步呼叫是物件的 IAdviseSink 介面。 當物件正在處理異步呼叫時,禁止對呼叫對象進行任何同步呼叫。

若要讓焦點管理和預先輸入等行為正常運作,輸入同步處理呼叫需要呼叫物件才能完成呼叫,才能放棄控制。

使用 WM_QUERYENDSESSION和 WM_ENDSESSION 關閉應用程式

當用戶結束 Windows 時,每個開啟的應用程式都會收到 WM_QUERYENDSESSION 訊息,後面接著 WM_ENDSESSION 訊息,前提是不會取消結束。 這些訊息是使用 SendMessage 函式叫用的,可惜地限制所有傳出 LRPC 呼叫的起始。 這是容器應用程式在收到關機要求時開啟內嵌物件的問題,因為需要 LRPC 才能關閉這些物件。

具有開啟檔案的容器和容器/伺服器應用程式通常會在收到 WM_QUERYENDSESSION 訊息時顯示消息框,詢問使用者是否要在結束之前儲存變更。 正面回應通常是預設值。 處理上述情況的建議是讓應用程式顯示替代消息框,詢問使用者是否要捨棄變更;負回應應該是預設值。 如果使用者選擇捨棄變更,則應該針對WM_QUERYENDSESSION傳回 TRUE,這會向 Windows 發出可終止的訊號。 如果使用者不想要捨棄變更,應該傳回 FALSE 。 不應嘗試關閉或釋放執行內嵌。

伺服器應用程式應該會針對WM_QUERYENDSESSION傳回 TRUE,而不提示使用者。 收到 WM_ENDSESSION 訊息時,所有 COM 應用程式都應該針對每個應用程式的檔和物件執行一般關閉順序。 同時,您應該忽略任何跨進程呼叫或 呼叫 IUnknown::Release 所產生的任何錯誤。 必須釋放所有記憶體指標 (IStorageIStream 介面指標) ,才能正確排清結構化記憶體複合檔案實作所維護的任何臨時檔。

規格需求

需求
最低支援的用戶端 Windows 2000 Professional [僅限傳統型應用程式]
最低支援的伺服器 Windows 2000 Server [僅限桌面應用程式]
目標平台 Windows
標頭 objidl.h