Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Generic Custom Type Mapper






COM-объекты – это еще одна разновидность сложных типов данных. Для передачи таких данных SOAP Toolkit включает в себя специальный Generic Custom Type Mapper (GCTM). С ним связана неприятная особенность генератора WSDL-файлов – когда он встречает параметр метода, имеющий тип " указатель на интерфейс", генератор вставляет в WSML-файл ссылку на GCTM. Но это совсем не означает, что SOAP Toolkit поддерживает передачу клиенту объектных ссылок, напротив, GCTM использует только свойства (properties) COM-объекта, сохраняя их в XML и восстанавливая на приемной стороне. При использовании GCTM происходит следующее:

  • Встречая в библиотеке типов параметр метода, имеющий тип – указатель на интерфейс, генератор WSDL-файлов рассматривает такой параметр как сложный тип, и составляет список всех свойств интерфейса. Процедура повторяется рекурсивно, если одно или несколько свойств имеют тип " указатель на интерфейс" (это может оказаться полезным для иерархий COM-объектов). Для каждого такого свойства генератор добавляет в WSML-файл его описание со ссылкой на GCTM.
  • При вызове метода на передающей стороне GCTM получает значения свойств COM-объекта (get_Property) и сохраняет полученные значения в XML.
  • На принимающей стороне GCTM создает COM-объект по CLSID, указанному в WSML-файле, и присваивает свойствам COM-объекта значения, переданные через XML.
  • Клиенту возвращается ссылка на созданный COM-объект.

Из этого следует:

  • Клиент получает копию COM-объекта, при работе с этой копией никаких вызовов по протоколу SOAP не происходит.
  • Клиенту передаются только те данные, которые доступны через открытые свойства объекта, описанные в IDL.
  • Если чтение/установка свойства COM-объекта имеет побочные эффекты, использование GCTM может привести к неожиданным последствиям.
  • GCTM не сможет работать с параметризованными свойствами.
  • GCTM не может передать клиенту свойства объекта, доступные только для чтения (read-only) или только для записи (write-only).
  • Семантика работы GCTM достаточно сильно отличается от передачи клиенту объектной ссылки и даже от распространенной в мире COM техники Marshal By Value (передача по значению), так как MBV обеспечивает передачу внутреннего состояния объекта, а GCTM – только значений свойств (подразумевая, что состояние объекта полностью определяется через его свойства).

Работу с GCTM иллюстрирует следующий пример:

... interface IGCTMDataObject: IDispatch { [propget, id(1)] HRESULT Data([out, retval] BSTR *pVal); [propput, id(1)] HRESULT Data([in] BSTR newVal); };... interface IGCTMSample: IDispatch { [id(1)] HRESULT Get([out]IGCTMDataObject** pData); };

Интерфейс IGCTMSample возвращает указатель на интерфейс IGCTMDataObject, имеющий одно read-write свойство Data.

Код клиента получает объект DataObject и читает его свойство:

Dim o As MSSOAPLib30.SoapClient30 Set o = New MSSOAPLib30.SoapClient30 o.MSSoapInit " D: ProjectsSOAPMapperSampleSrvIISMapperSampleSrv.WSDL",, _ " GCTMSampleSoapPort", _ " D: ProjectsSOAPMapperSampleSrvIISMapperSampleSrvClient.WSML" Dim p As Object o.Get p MsgBox p.Data

Как и для UDT Mapper-а, при инициализации клиента необходимо указать местоположение WSML-файла и предоставить клиенту библиотеку типов с описанием передаваемого интерфейса. Специфика использования GCTM заключается в том, что клиент предпримет попытку создать передаваемый COM-объект, поэтому помимо библиотеки типов клиенту потребуется модуль, содержащий код компонента.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.