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


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

Записывает в поток данные, необходимые для инициализации прокси-объекта в некотором клиентском процессе.

Синтаксис

HRESULT CoMarshalInterface(
  [in]           LPSTREAM  pStm,
  [in]           REFIID    riid,
  [in]           LPUNKNOWN pUnk,
  [in]           DWORD     dwDestContext,
  [in, optional] LPVOID    pvDestContext,
  [in]           DWORD     mshlflags
);

Параметры

[in] pStm

Указатель на поток, используемый во время маршалинга. См. раздел IStream.

[in] riid

Ссылка на идентификатор маршалированного интерфейса. Этот интерфейс должен быть производным от интерфейса IUnknown .

[in] pUnk

Указатель на интерфейс для маршалинга. Этот интерфейс должен быть производным от интерфейса IUnknown .

[in] dwDestContext

Контекст назначения, в котором требуется отменить удаление указанного интерфейса. Возможные значения поступают из перечисления MSHCTX. В настоящее время размежевание может происходить в другом объекте текущего процесса (MSHCTX_INPROC), в другом процессе на том же компьютере, что и текущий процесс (MSHCTX_LOCAL), или в процессе на другом компьютере (MSHCTX_DIFFERENTMACHINE).

[in, optional] pvDestContext

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

[in] mshlflags

Флаги, указывающие, должны ли данные для маршалинга передаваться обратно в клиентский процесс (типичный случай) или записываться в глобальную таблицу, где их могут извлечь несколько клиентов. Возможные значения поступают из перечисления MSHLFLAGS .

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

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

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

Комментарии

Функция CoMarshalInterface маршалирует интерфейс, на который ссылается riid, в объекте, на реализацию IUnknown которого указывает pUnk. Для этого функция CoMarshalInterface выполняет следующие задачи:

  1. Запрашивает у объекта указатель на интерфейс IMarshal . Если объект не реализует IMarshal, а это означает, что он использует COM для обеспечения поддержки маршалинга, CoMarshalInterface получает указатель на реализацию COM по умолчанию IMarshal.
  2. Получает CLSID прокси-сервера объекта путем вызова метода IMarshal::GetUnmarshalClass, используя любой указатель интерфейса IMarshal , который был возвращен.
  3. Записывает CLSID прокси-сервера в поток, используемый для маршалинга.
  4. Маршалирует указатель интерфейса, вызывая IMarshal::MarshalInterface.
Библиотека COM в клиентском процессе вызывает функцию CoUnmarshalInterface для извлечения данных и инициализации прокси-сервера. Перед вызовом CoUnmarshalInterface вернитесь к исходной позиции в потоке.

Если вы реализуете существующие COM-интерфейсы или определяете собственные интерфейсы с помощью языка MIDL, созданные midl прокси-серверы и заглушки вызывают CoMarshalInterface . Если вы пишете собственные прокси-серверы и заглушки, код прокси-сервера и код заглушки должны вызывать CoMarshalInterface , чтобы правильно маршалировать указатели интерфейса. Не рекомендуется вызывать IMarshal непосредственно из прокси-сервера и кода заглушки.

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

Требования

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

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

CoUnmarshalInterface

IMarshal::MarshalInterface