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


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

Уничтожает ранее маршалированные пакеты данных.

Синтаксис

HRESULT CoReleaseMarshalData(
  [in] LPSTREAM pStm
);

Параметры

[in] pStm

Указатель на поток, содержащий пакет данных, который требуется уничтожить. См. раздел IStream.

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

Эта функция может возвращать стандартные возвращаемые значения E_FAIL, E_INVALIDARG, E_OUTOFMEMORY и E_UNEXPECTED, а также следующие значения.

Код возврата Описание
S_OK
Пакет данных был успешно уничтожен.
STG_E_INVALIDPOINTER
Ошибка, связанная с параметром pStm .
CO_E_NOTINITIALIZED
Функция CoInitialize или OleInitialize не была вызвана в текущем потоке до вызова этой функции.

Комментарии

Важно  

Примечание по безопасности. Вызов этого метода с недоверенными данными представляет угрозу безопасности. Вызывайте этот метод только для надежных данных.

 
Функция CoReleaseMarshalData выполняет следующие задачи:
  1. Функция считывает CLSID из потока.
  2. Если используется реализация маршалинга COM по умолчанию, функция получает указатель IMarshal на экземпляр стандартного unmarshaler. Если используется настраиваемое маршалинг, функция создает прокси-сервер, вызывая функцию CoCreateInstance , передавая идентификатор CLSID, который он считывает из потока, и запрашивает указатель интерфейса IMarshal к только что созданному прокси-серверу.
  3. Используя любой указатель интерфейса IMarshal , который он получил, функция вызывает IMarshal::ReleaseMarshalData.
Обычно эта функция не вызывается. Единственная ситуация, в которой может потребоваться вызвать эту функцию, — это использование пользовательского маршалинга (написание и использование собственной реализации IMarshal). Примеры вызова CoReleaseMarshalData включают следующие ситуации:
  • Предпринята попытка отменить удаление пакета данных, но она не удалась.
  • Пакет маршалированных данных был удален из глобальной таблицы.
В качестве аналогии пакет данных можно рассматривать как ссылку на исходный объект так же, как если бы это был другой указатель интерфейса, удерживаемый на объекте. Как и реальный указатель интерфейса, этот пакет данных должен быть освобожден в какой-то момент. Использование IMarshal::ReleaseMarshalData для выпуска пакетов данных аналогично использованию указателей интерфейса IUnknown::Release для выпуска.

Обратите внимание, что не нужно вызывать CoReleaseMarshalData после успешного вызова функции CoUnmarshalInterface . эта функция освобождает данные маршалирования в рамках обработки, которую она выполняет.

Важно Для маршалинга объекта в поток необходимо вызвать функцию CoReleaseMarshalData в том же объекте, что и CoMarshalInterface . Сбой может привести к утечке ссылки на объект, хранящиеся в маршалированных пакетах в потоке.
 

Требования

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

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

IMarshal::ReleaseMarshalData