Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Используйте следующий вызов, чтобы создать объект глобальной таблицы интерфейса и получить указатель на 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, который можно использовать вместо передачи фактического указателя (каждый раз, когда необходимо передать указатель), либо в параметр, не являющийся методом и перемещающийся в другое окружение (в качестве параметра для ThreadProc через CreateThread), либо во внутрипроцессную память, доступную за пределами вашего окружения.
Необходимо соблюдать осторожность, так как использование глобальных интерфейсов накладывает на программиста дополнительную нагрузку управления такими проблемами, как условия гонки и взаимное исключение, которые связаны с доступом к глобальному состоянию из нескольких потоков одновременно.
COM предоставляет стандартную реализацию интерфейса IGlobalInterfaceTable. Настоятельно рекомендуется использовать эту стандартную реализацию, так как она обеспечивает полную функциональность, безопасную для потоков.
Связанные разделы