Поделиться через


Создание глобальной таблицы интерфейса

Используйте следующий вызов для создания объекта глобальной таблицы интерфейса и получения указателя на 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, определяющий интерфейс и его расположение. Квартира, ищущая указатель на этот интерфейс, затем вызывает метод GetInterfaceFromGlobal с этим файлом cookie, а затем реализация предоставляет указатель интерфейса вызывающей квартире. Чтобы отменить глобальную регистрацию интерфейса, любая квартира может вызвать метод RevokeInterfaceFromGlobal.

Простой пример использования IGlobalInterfaceTable может быть, если вы хотите передать указатель интерфейса на объект в однопоточной квартире (STA) рабочему потоку в другой квартире. Вместо того чтобы маршалировать его в поток и передавать поток в рабочий поток в качестве параметра потока, IGlobalInterfaceTable позволяет просто передать файл cookie.

При регистрации интерфейса в глобальной таблице интерфейсов вы получите файл cookie, который можно использовать вместо передачи фактического указателя (всякий раз, когда нужно передать указатель), либо в параметр nonmethod, который собирается в другую квартиру (в качестве параметра ThreadProc через CreateThread) или для внутрипроцессной памяти, доступной за пределами вашей квартиры.

Требуется забота, так как использование глобальных интерфейсов накладывает дополнительную нагрузку на программиста по управлению такими проблемами, как условия гонки и взаимное исключение, которые связаны с доступом к глобальному состоянию из нескольких потоков одновременно.

COM предоставляет стандартную реализацию интерфейса IGlobalInterfaceTable . Настоятельно рекомендуется использовать эту стандартную реализацию, так как она обеспечивает полную функциональность, безопасную для потоков.

Когда следует использовать глобальную таблицу интерфейсов