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


Метод IMarshal::GetUnmarshalClass (objidl.h)

Извлекает ИДЕНТИФИКАТОР CLSID кода распаковки.

Синтаксис

HRESULT GetUnmarshalClass(
  [in]  REFIID riid,
  [in]  void   *pv,
  [in]  DWORD  dwDestContext,
  [in]  void   *pvDestContext,
  [in]  DWORD  mshlflags,
  [out] CLSID  *pCid
);

Параметры

[in] riid

Ссылка на идентификатор маршалированного интерфейса.

[in] pv

Указатель на интерфейс для маршалирования; может иметь значение NULL , если вызывающий объект не имеет указателя на нужный интерфейс.

[in] dwDestContext

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

[in] pvDestContext

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

[in] mshlflags

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

[out] pCid

Указатель, который получает идентификатор CLSID, используемый для создания прокси-сервера в клиентском процессе.

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

Если метод выполнен успешно, возвращаемое значение будет S_OK. В противном случае это S_FALSE.

Комментарии

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

Для создания прокси-сервера для объекта COM требуются два фрагмента информации из исходного объекта: объем данных, записываемых в поток маршалинга, и CLSID прокси-сервера.

Маршалинговая заглушка получает эти два фрагмента информации с последовательными вызовами CoGetMarshalSizeMax и CoMarshalInterface.

Примечания к вызывающим абонентам

Заглушка маршалинга вызывает реализацию этого метода объекта для получения идентификатора CLSID, который будет использоваться при создании экземпляра прокси-сервера. Клиент, получив ИДЕНТИФИКАТОР CLSID, загружает библиотеку DLL, указанную для него в системном реестре.

Этот метод не вызывается явным образом, если вы реализуете существующие COM-интерфейсы или используете язык определения интерфейса Майкрософт (MIDL) для определения собственных интерфейсов. В любом случае заглушка автоматически выполняет вызов. См . раздел Определение COM-интерфейсов.

Если вы не используете MIDL для определения собственного интерфейса, заглушка должна вызвать этот метод напрямую или косвенно, чтобы получить ИДЕНТИФИКАТОР CLSID, необходимый клиентской библиотеке COM для создания прокси-сервера для объекта, реализующего интерфейс.

Если вызывающий объект имеет указатель на интерфейс для маршалирования, он должен, с точки зрения эффективности, использовать параметр pv для передачи этого указателя. Таким образом, реализация, которая может использовать такой указатель для определения соответствующего идентификатора CLSID для прокси-сервера, не требует вызова QueryInterface для себя. Если вызывающий объект не имеет указателя на интерфейс для маршалирования, он может передать значение NULL.

Примечания для разработчиков

COM вызывает GetUnmarshalClass , чтобы получить ИДЕНТИФИКАТОР CLSID, который будет использоваться для создания прокси-сервера в клиентском процессе. ClSID, используемый для прокси-сервера, обычно не является идентификатором исходного объекта, а идентификатором CLSID, который вы создали (с помощью средства Guidgen.exe) специально для прокси-объекта.

Реализуйте этот метод для каждого объекта, который обеспечивает маршалирование для одного или нескольких его интерфейсов. Код, отвечающий за маршалинг объекта, записывает CLSID вместе с данными маршалинга в поток; COM извлекает ИДЕНТИФИКАТОР CLSID и данные из потока на принимающей стороне.

Если реализация прокси-сервера состоит из простого копирования всего исходного объекта в клиентский процесс, устраняя тем самым необходимость переадресации вызовов исходному объекту, возвращаемый идентификатор CLSID будет таким же, как и исходный объект. Эта стратегия, конечно, рекомендуется только для объектов, которые не должны изменяться.

Если параметр pv имеет значение NULL и для реализации требуется указатель интерфейса, он может вызвать QueryInterface для текущего объекта, чтобы получить его. Параметр pv существует только для повышения эффективности.

Чтобы обеспечить правильную работу реализации GetUnmarshalClass при поддержке новых контекстов назначения в будущем, делегируйте маршалинг в реализацию COM по умолчанию для всех значений dwDestContext , которые не обрабатываются в вашей реализации. Чтобы делегировать маршалинг реализации com по умолчанию, вызовите функцию CoGetStandardMarshal .

Примечание Значение реестра ThreadingModel должно иметь значение Оба для внутрипроцессного сервера, реализующего идентификатор CLSID, возвращаемый методом GetUnmarshalClass . Дополнительные сведения см. в разделе InprocServer32.
 

Требования

Требование Значение
Минимальная версия клиента Windows 2000 Профессиональная [классические приложения | Приложения UWP]
Минимальная версия сервера Windows 2000 Server [классические приложения | Приложения UWP]
Целевая платформа Windows
Header objidl.h

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

CoMarshalInterface

IMarshal