创建全局接口表
使用以下调用创建全局接口表对象并获取指向 IGlobalInterfaceTable 的指针:
HRESULT hr;
hr = CoCreateInstance(CLSID_StdGlobalInterfaceTable,
NULL,
CLSCTX_INPROC_SERVER,
IID_IGlobalInterfaceTable,
(void **)&gpGIT);
if (hr != S_OK) {
exit(0); // Handle errors here.
}
注意
使用上述调用创建全局接口表对象时,必须链接到库 uuid.lib。 这将解析外部符号 CLSID_StdGlobalInterfaceTable 和 IID_IGlobalInterfaceTable。
每个进程都有全局接口表的一个实例,因此对进程中此函数的所有调用都会返回相同的实例。
调用 CoCreateInstance 函数后,使用 RegisterInterfaceInGlobal 方法调用从其所在的单元注册接口。 此方法提供标识接口及其位置的 Cookie。 接着,寻求指向此接口的指针的单元使用此 Cookie 调用 GetInterfaceFromGlobal 方法,然后实现会提供指向调用单元的接口指针。 若要撤销接口的全局注册,任何单元都可以调用 RevokeInterfaceFromGlobal 方法。
使用 IGlobalInterfaceTable 的一个简单示例是,要将单线程单元 (STA) 中的对象上的接口指针传递给另一单元中的工作线程。 IGlobalInterfaceTable 允许仅传递 Cookie,而不必将其封送到流中并将流作为线程参数传递给工作线程。
在全局接口表中注册接口时,会获取一个可以使用的 Cookie,而不是将实际指针(每当需要传递指针时)传递到将前往另一个单元的非方法参数(作为参数通过 CreateThread 传递给 ThreadProc),或传递到可在单元外部访问的进程内内存。
需要注意,因为使用全局接口会给程序员带来额外的负担,即与同时从多个线程访问全局状态相关的管理问题(如争用条件和相互排斥)。
COM 提供 IGlobalInterfaceTable 接口的标准实现。 强烈建议使用此标准实现,因为它提供完整的线程安全功能。
相关主题
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈