创建全局接口表

使用以下调用创建全局接口表对象并获取指向 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 接口的标准实现。 强烈建议使用此标准实现,因为它提供完整的线程安全功能。

何时使用全局接口表