IGlobalOptions 介面 (objidl.h)

設定和查詢元件物件模型 (COM) 運行時間的全域屬性。

繼承

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

方法

IGlobalOptions 介面具有這些方法。

 
IGlobalOptions::Query

IGlobalOptions::Query 方法 (objidl.h) 會查詢 COM 運行時間的指定全域屬性。
IGlobalOptions::Set

IGlobalOptions::Set 方法 (objidl.h) 設定 COM 運行時間的指定全域屬性。

備註

您可以使用這個介面來設定及查詢 COM 執行時間的下列全域屬性。

屬性
COMGLB_APPID 進程的AppID。 這是 Windows XP 上唯一支援的屬性。
COMGLB_EXCEPTION_HANDLING COMGLB_EXCEPTION_HANDLING屬性的可能值為:
  • COMGLB_EXCEPTION_HANDLE:這是預設行為。 此設定會導致 COM 執行時間處理嚴重例外狀況。
  • COMGLB_EXCEPTION_DONOT_HANDLE:這會導致 COM 運行時間無法處理嚴重例外狀況。
  • COMGLB_EXCEPTION_DONOT_HANDLE_FATAL:COMGLB_EXCEPTION_DONOT_HANDLE的別名。 Windows 7 和更新版本支援。
  • COMGLB_EXCEPTION_DONOT_HANDLE_ANY:在 COM 方法中設定併發生嚴重例外狀況時,這會導致 COM 運行時間無法處理例外狀況。

    在 COM 方法中設定和非嚴重例外狀況時,這會導致 COM 運行時間建立 Windows 錯誤報告 (WER) 傾印並終止進程。 Windows 7 和更新版本支援。

根據預設,COM 運行時間會處理方法調用期間引發的嚴重例外狀況,方法是將RPC_E_SERVERFAULT錯誤碼傳回用戶端。 應用程式會停用此行為,以允許例外狀況傳播至 WER,這會建立應用程式進程傾印並終止應用程式。 這可防止可能的數據損毀,並允許應用程式廠商對傾印進行偵錯。
注意 即使停用 COM 運行時間例外狀況處理,如果處理程式中有另一個處理例外狀況的應用層級例外狀況處理程式,例外狀況可能不會傳播至 WER。
 
對於新的應用程式,建議將 COMGLB_EXCEPTION_HANDLING 屬性設定為 COMGLB_EXCEPTION_DONOT_HANDLE_ANY。
COMGLB_RPC_THREADPOOL_SETTING Set 方法中COMGLB_RPC_THREADPOOL_SETTING屬性的可能值為:
  • COMGLB_RPC_THREADPOOL_SETTING_PRIVATE_POOL:指示 RPC 使用專用的私人線程集區。
Query 方法中COMGLB_RPC_THREADPOOL_SETTING屬性的可能值為:
  • COMGLB_RPC_THREADPOOL_SETTING_PRIVATE_POOL:RPC 會使用專用的私人線程集區。
  • COMGLB_RPC_THREADPOOL_SETTING_DEFAULT_POOL:RPC 會使用系統預設線程集區。
RPC 預設會在 Windows 7 中使用系統線程集區。 由於系統線程集區是由進程中的多個元件共用,因此如果線程集區狀態損毀,COM 和 RPC 作業的行為可能不正確。

COMGLB_RPC_THREADPOOL_SETTING 屬性可用來變更 RPC 線程集區行為。 變更預設行為會產生效能負面影響,因為這會導致 RPC 使用額外的線程。 因此,變更此設定時應該小心。 建議您只基於應用程式相容性考慮而變更此設定。

注意 這個屬性必須在程式中初始化 COM 之後立即設定。 如果在執行會導致 COM 初始化 RPC (通道的任何作業之後設定此屬性,例如封送處理或取消封送處理或取消封送處理物件參考 ) ,Set 方法將會失敗。
 
注意 只有 Windows 7 和更新版本的 Windows 才支援這個屬性。
COMGLB_RO_SETTINGS COMGLB_RO_SETTINGS屬性的可能值為:
  • COMGLB_FAST_RUNDOWN:表示目前進程中的存根受限於快速存根執行行為,這表示存根會在客戶端進程終止時關閉,而不是等待正常清除逾時到期。
  • COMGLB_STA_MODALLOOP_REMOVE_TOUCH_MESSAGES:從 STA 強制回應迴圈中的消息佇列中移除觸控訊息。
  • COMGLB_STA_MODALLOOP_SHARED_QUEUE_REMOVE_INPUT_MESSAGES:當線程的訊息佇列附加時,會在 STA 強制回應迴圈中移除輸入訊息。
  • COMGLB_STA_MODALLOOP_SHARED_QUEUE_DONOT_REMOVE_INPUT_MESSAGES:附加線程消息佇列時,在 STA 強制回應迴圈中不會移除輸入訊息。
  • COMGLB_STA_MODALLOOP_SHARED_QUEUE_REORDER_POINTER_MESSAGES:當線程的訊息佇列已附加,但暫時遮罩以避免附加佇列產生的死結時,STA 強制回應迴圈中不會移除指標輸入訊息。
  • COMGLB_RESERVED1:保留供日後使用。
  • COMGLB_RESERVED2:保留供日後使用。
  • COMGLB_RESERVED3:保留供日後使用。
注意此屬性僅支援 Windows 8 和更新版本的 Windows。
COMGLB_UNMARSHALING_POLICY COMGLB_UNMARSHALING_POLICY屬性的可能值為:
  • COMGLB_UNMARSHALING_POLICY_NORMAL:取消封入行為與 Windows 8 之前的版本相同。 如果此旗標是在 CoInitializeSecurity 中設定,則EOAC_NO_CUSTOM_MARSHAL限制適用。 否則,沒有任何限制。 這是不在應用程式容器中的進程預設值。
  • COMGLB_UNMARSHALING_POLICY_STRONG:Unmarshaling 只允許 CoAllowUnmarshalerCLSID 函式允許個別進程的強化 unmarshalers 和 unmarshalers 的系統信任列表。 這是應用程式容器中進程的預設值。
  • COMGLB_UNMARSHALING_POLICY_HYBRID:取消封存數據,其來源是應用程式容器,只允許 CoAllowUnmarshalerCLSID 函式允許個別進程的強化 unmarshalers 和 unmarshalers 系統信任清單。 具有非應用程式容器之來源之數據的取消封存行為與舊版不同。
注意此屬性僅支援 Windows 8 和更新版本的 Windows。
 

對於偵測損毀和其他可能會在執行輸入 COM 呼叫時產生的例外狀況的應用程式而言很重要,例如在本機伺服器上或執行 IDropTarget::D rop 方法時呼叫,若要將COMGLB_EXCEPTION_HANDLING設定為COMGLB_EXCEPTION_DONOT_HANDLE以停用攔截例外狀況的 COM 行為。 無法這樣做可能會導致進程狀態損毀,例如擲回這些例外狀況時所保留的鎖定,而且進程可能會進入不一致的狀態。

所有這類應用程式都應該在啟動時執行此程序代碼。

    IGlobalOptions *pGlobalOptions;
    hr =  CoCreateInstance(CLSID_GlobalOptions, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pGlobalOptions));
    if (SUCCEEDED(hr))
    {
        hr = pGlobalOptions->Set(COMGLB_EXCEPTION_HANDLING, COMGLB_EXCEPTION_DONOT_HANDLE);
        pGlobalOptions->Release();
    }

規格需求

需求
最低支援的用戶端 Windows Vista [傳統型應用程式 |UWP 應用程式]
最低支援的伺服器 Windows Server 2003 [傳統型應用程式 |UWP 應用程式]
目標平台 Windows
標頭 objidl.h (包含 ObjIdl.h)

另請參閱

IMarshalingStream