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