Передача структур в качестве входных и выходных параметров
Вот простой пример того, как метод 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 изменяется, поскольку элементы копируются из msl, а затем 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. В дальнейшем это позволит вам применять некоторые интересные возможности, связанные с интеграцией.
CompEbook.ru Железо, дизайн, обучение и другие