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


Функция CoDisconnectObject (combaseapi.h)

Отключает все подключения к удаленному процессу, поддерживаемые от имени всех указателей интерфейса, указывающих на указанный объект.

Только процесс, который фактически управляет объектом, должен вызывать CoDisconnectObject.

Синтаксис

HRESULT CoDisconnectObject(
  [in] LPUNKNOWN pUnk,
  [in] DWORD     dwReserved
);

Параметры

[in] pUnk

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

[in] dwReserved

Этот параметр зарезервирован и должен иметь значение 0.

Возвращаемое значение

Эта функция возвращает S_OK, чтобы указать, что все подключения к удаленным процессам были успешно удалены.

Комментарии

Функция CoDisconnectObject позволяет серверу правильно отключить все внешние клиенты от объекта, указанного pUnk.

Он выполняет следующие задачи:

  1. Проверяет, реализует ли отключенный объект интерфейс IMarshal . Если да, он получает указатель на этот интерфейс; В противном случае он получает указатель на реализацию IMarshal стандартного маршалера (т. е. COM).
  2. Используя полученный указатель интерфейса IMarshal , функция вызывает IMarshal::D isconnectObject для отключения всех клиентов вне процесса.
Клиент объекта не вызывает CoDisconnectObject , чтобы отключиться от сервера (клиенты должны использовать IUnknown::Release для этой цели). Скорее, сервер OLE вызывает CoDisconnectObject для принудительного отключения клиентов объекта, как правило, в ответ на закрытие пользователем серверного приложения.

Аналогичным образом контейнер OLE, поддерживающий внешние ссылки на внедренные объекты, может вызывать CoDisconnectObject для уничтожения этих связей. Опять же, этот вызов обычно выполняется в ответ на закрытие приложения пользователем. Контейнер должен сначала вызвать IOleObject::Close для всех своих объектов OLE, каждый из которых должен отправлять уведомления IAdviseSink::OnClose различным клиентам. Затем контейнер может вызвать CoDisconnectObject , чтобы закрыть все существующие подключения.

CoDisconnectObject не обязательно немедленно отключает внепроцессные клиенты. Если какие-либо маршалированные вызовы находятся в состоянии ожидания в объекте сервера, CoDisconnectObject отключает объект только после возврата этих вызовов. В то же время CoDisconnectObject устанавливает флаг, который приводит к возврату всех новых маршалированных вызовов CO_E_OBJNOTCONNECTED.

Требования

Требование Значение
Минимальная версия клиента Windows 2000 Профессиональная [классические приложения | Приложения UWP]
Минимальная версия сервера Windows 2000 Server [классические приложения | Приложения UWP]
Целевая платформа Windows
Header combaseapi.h (включая Objbase.h)
Библиотека Ole32.lib
DLL Ole32.dll

См. также раздел

IAdviseSink::OnClose

IMarshal::D isconnectObject

IOleObject::Close