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 函数对每个进程允许的强化的未编组和取消编组程序的系统信任列表。 这是应用容器中进程的默认值。
  • COMGLB_UNMARSHALING_POLICY_HYBRID:取消封存数据(其源为应用容器)仅允许 由 CoAllowUnmarshalerCLSID 函数按进程允许的强化未编组器和未编组程序的系统信任列表。 对于源不是应用容器的数据,取消封送行为与以前的版本不同。
注意此属性仅在 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