Студопедия

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

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

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






UDT Mapper






UDT представляет собой структуру, состоящую из oleautomation-совместимых типов. В Visual Basic 6 UDT определяются следующим образом:

Type Employee EmpNumber As Integer EmpOfficePhone As String EmpHomePhone As String End Type UDT могут быть вложенными: Type Man emp As Employee End Type

На UDT распространяются следующие ограничения:

  • Передаются только по ссылке. Это означает, что в IDL параметры метода должны указываться как указатель на UDT. Например, [in] Employee* pEmp.
  • Не могут быть только выходными, то есть следующее описание параметра: [out] Employee* pEmp является некорректным.

Рассмотрим использование UDT Mapper-а на следующем примере:

typedef [uuid(C1D3A8C0-A4AA-11D0-819C-00A0C90FFFC3)] struct UDT { unsigned long a1; BSTR pbstr; } UDT;... interface IUDTSample: IDispatch { [id(1)] HRESULT GetData([in]UDT* pIn, [in, out]UDT* pOut); };

Наш COM-объект поддерживает метод GetData, имеющий входной и выходной параметры типа UDT. Более подробно о работе с UDT в COM можно прочитать по адресу https://rsdn.ru/article/? com/varsafearr.xml.

СОВЕТ В сгенерированном мастером WSML-файле появится ссылка на UDT Mapper:
< using PROGID='MSSOAP.UDTMapper30' cachable='0' ID='UDTM' /> < types> < type name='UDT' targetNamespace=... uses='UDTM' targetClassId='XX' libGUID='YY' libVersion='1.0'/> < /types>

Клиент осуществляет вызов так:

Dim o As MSSOAPLib30.SoapClient30 Set o = New MSSOAPLib30.SoapClient30 o.MSSoapInit " D: ProjectsSOAPMapperSampleSrvIISMapperSampleSrv.WSDL",,, " D: ProjectsSOAPMapperSampleSrvIISMapperSampleSrv.WSML" Dim q As UDT q.a1 = 1 Dim r As UDT o.GetData q, r MsgBox CStr(r.a1) & r.pbstr
СОВЕТ Реализация клиента на VC++ будет немного сложнее, так как для UDT придется получать интерфейс IRecordInfo*, описывающий UDT – сделать это можно с помощью функции GetRecordInfoFromGuids. Подробнее см. в вышеупомянутой статье.

В коде клиента есть две особенности, связанных с использованием mapper-а:

  • При инициализации клиента нужно указывать путь к WSML-файлу. Это необходимо, так как при вызове метода будут передаваться сложные типы и клиенту потребуется их описание и ссылка на mapper, преобразующий сложный тип.
  • Клиенту необходима библиотека типов, содержащая описание UDT. Mapper будет использовать ее для преобразования данных в XML.





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