Передача структур в качестве входных и выходных параметров. Резюме.
Вот простой пример того, как метод Web-службы может использовать структуры в качестве входных и выходных параметров. В исходный файл ATLServerWeb.h была добавлена структура MyStructure (Моя структура), содержащая два элемента типа int. Кроме того, в интерфейс IATLServerWebService был добавлен новый метод CopyMyStructure (Копировать мою структуру), который в качестве параметров передает в MyStructure указатели и принимает их от нее. Затем данный метод реализуется в классе CATLServerWebService.
namespace ATLServerWebService // пространство имен ATLServerWebService { struct MyStructure { int x; int y; }; [ uuid("53A879FF-9D20-42A8-9978-COD4B05B10B7"), object / / объект ] interface IATLServerWebService // интерфейс { HRESULT CopyMyStructure ( [in ] MyStructure *pms1, [out ] MyStructure *pms2); }; class CATLSeir-verWebService: public IATLServerWebService { public: [ soap me tihod ] HRESULT CopyMyStructure( MyStructure *pms1, MyStructure *pms2) { pms2 › x = pms1 › x; pms2 › y = pms1 › y; return S_OK; } };
А вот клиентский код, который проверяет передачу входных и выходных параметров.
// передача указателей на структуры // в качестве входных и выходных параметров struct ATLServerWebService: – . MyStructure msl, ms2; ms1.x = 10; msl.у = 20; ms2.x = 0; ms2.y = 0; wprintf( L"ms1.x: %d, ms1.y: %d, ms2.x: %d, ms2.y: %d\n", ms1.x, ms1.y, ms2.x, ms2.y); wprintf( L"Calling CopyMyStructure(&ms1, &ms2)\n", ms2.x, ms2.y); service.CopyMyStructure (// служба &ms1, sizeof (ATLServerWebService::MyStructure), &ms2); wprintf( L"ms1.x: %d, ms1.y: %d, ms2.x: %d, ms2.y: %d\n", ms1.x, ms1.y, ms2.x, ms2.y);
Приводимая далее выдача программы доказывает, что маршализация структуры может выполняться в обоих направлениях. Вначале элементы х и у структуры ms2 содержат нулевые значения. Во время вызова метода CopyMyStructure структура ms2 изменяется, поскольку элементы копируются из ms1, а затем ms2 передается обратно клиенту.
msl.x: 10, msl.y: 20, ms2.x: 0, ms2.y: 0 Calling CopyMyStructure(&msl, &ms2) msl.x: 10, msl.y: 20, ms2.x: 10, ms2.y: 20
Сейчас вас, возможно, удивит, зачем было затевать столько работы. И чем это все лучше предоставления функций в виде динамически подключаемой библиотеки (DLL) или вызова удаленных процедур (RFC – Remote Procedure Call) или распределенной модели компонентных объектов (DCOM – Distributed Component Object Model)? Так вот, "крутизна" Web-службы как раз в том, что она, в отличие от динамически подключаемой библиотеки (DLL), может находиться в любом месте Internet. Кроме того, Web-службы, в отличие от вызова удаленных процедур (RFC – Remote Procedure Call) или распределенной модели компонентных объектов (DCOM – Distributed Component Object Model), создаются на основе языка XML и SOAP. В дальнейшем это позволит вам применять некоторые интересные возможности, связанные с интеграцией.
Резюме
Web-службы позволяют создавать крупномасштабные распределенные приложения, которые могут использовать вездесущую природу Internet. Эти службы строятся на основе стандартных и повсеместных протоколов, таких, как HTML, XML и SOAP, поэтому они значительно более гибки и естественны, чем построенные на основе традиционных распределенных компьютерных технологий, таких, например, как вызов удаленных процедур (RFC – Remote Procedure Call). Библиотека шаблонных классов ATL предоставляет возможности для создания Web-служб, и благодаря своей эффективности является идеальным средством для реализации тех Web-служб, от которых требуется высокая производительность.