MFC中使用SOAP客户端的指南

在Windows 98用户能够使用ROPE.dll的第二天,微软发布了新的SOAP Toolkit 2.0。这个新工具包不仅支持更多Windows版本,而且所有内容都发生了变化。现在,可以开始为用户提供使用单一DLL集的优秀Web服务了,但是等等,CPP示例在哪里??又一次,新技术因为只有VB示例而受到阻碍!决定,为了更好地掌握这个新工具包,将把示例转换为MFC,这是第一个。这是一个使用高级SOAP客户端API的MFC实现。第一组示例代码使用了SOAP Toolkit中包含的简单参数类型计算器服务。第二组是一个简单的ATL对象,客户端和ASP侦听器,用于测试字符串的传递。

开始之前

在开始之前,应该按照SOAP Toolkit samples.htm文件中的说明进行操作。首先,需要在Web服务器上创建一个虚拟目录。然后,需要创建ClcVBSrv DLL。VB项目可以在SOAP Toolkit安装目录下的samples/ClcVBSrv文件夹中找到。构建DLL后,需要使用wsdlgen.exe重新创建Web服务描述语言(WSDL)文件和Web服务元语言(WSML)文件,以包含Web服务器的位置。这项服务的ASP侦听器不需要更改。

项目概述

该项目是一个简单的MFC对话框应用程序。创建了一个非常简单的界面,类似于VB客户端中的界面。

在项目中包含SoapClient

在MFC应用程序中包含SoapClient的最简单方法是使用COleDispatchDriver类。基本上,COleDispatchDriver类允许实现COM的客户端端,提供对对象方法和属性的访问。

要将SoapClient添加到项目中,请转到类向导。点击“添加类”按钮,然后选择“来自类型库”。然后,定位MSSOAP1.dll。然后,将得到一个包含在DLL中的接口列表供选择。对于这个简单项目的目的,只需要ISOAPClient接口。这将向项目中添加两个文件mssoap1.cpp和mssoap1.h。

要使用SoapClient接口,请添加一个类型为ISOAPClient的变量,例如: ISOAPClient * m_pClient

创建ISOAPClient指针

由于为SoapClient接口变量使用了指针,因此在实际使用之前需要两个步骤。首先,创建一个新的ISOAPClient类型指针。这会为对象创建一个C++包装器。然后创建一个IDispatch对象,它会自动附加到包装器上。

Allocate a new SoapClient pointer m_pClient = new ISOAPClient; Now create the SoapClient pointer m_pClient->CreateDispatch("MSSOAP.SoapClient");

CreateDispatch函数为处理IDispatch指针的创建。只需要提供想要使用的对象的ProgId(在这种情况下是MSSOAP.SoapClient)。

注意:可以通过包含版本(例如"MSSOAP.SoapClient.1")来创建一个版本依赖的实例化。这是从未发现需要的东西!

创建SoapClient后,使用mssoapinit函数初始化它,传递服务器名称、端口和WSML文件的名称。 m_pClient->mssoapinit("http://www.MyService.com/SoapSamples/CalcVB.wsdl", "CalcVB", "CalcVBPortType", NULL);

调用Web服务函数

现在已经准备好使用SoapClient了,但是如何调用服务函数呢。在这种情况下,简单地调用 m_pClient->Add(23.34, 34.2) 会导致编译器错误。应用程序需要知道一些关于函数的信息。

要使用Web服务函数,需要声明函数的头部和主体。以Add函数为例,头部和主体如下:

Function header double Add(double dblA, double dblB, DISPID dispid); Function body double ISOAPClient::Add(double dblA, double dblB, DISPID dispid) { double result; static BYTE parms[] = VTS_R8 VTS_R8; InvokeHelper(dispid, DISPATCH_METHOD, VT_R8, (void*)&result, parms, dblA, dblB); return result; }

该函数本身接受两个双精度浮点数作为参数,并返回一个双精度浮点数。添加了dispid参数以传递正在调用的函数的调度ID。函数主体使用InvokeHelper调用Add函数。InvokeHelper函数相当容易使用。有关使用此函数的完整详细信息,可以在MSDN文档中找到。

将这些函数添加到了mssoap cpp和头文件中,尽管可以在其他地方声明它们并将SoapClient指针/对象传递进去。

注意:如果向向导创建的文件中添加了额外的函数,当添加来自COM对象的更多接口时,必须小心,因为额外的函数可能会被删除。

这只留下了获取要调用的函数的调度ID。

实际上,调用函数的一种快速而简单的方法是使用OLE控制器的内部索引。这通常会按照它们编号的顺序对函数进行索引。从-1开始向上索引。这可能会在十次中有九次有效。然而,COM并没有规定控制器必须这样做,因此结果不能保证。

所以,创建了一个函数来获取需要的dispid。

Function to get the Dispatch ID of the function we want to call Pre : strFXName is the name of the function Post: returns the dispath id of the function DISPID CDemo1Dlg::GetDispid(CString strFxName) { OLECHAR * name = strFxName.AllocSysString(); DISPID dispid; Using the dispatch pointer member get the dispatch id of the required function from the interface m_pClient->m_lpDispatch->GetIDsOfNames(IID_NULL, &name, 1, GetUserDefaultLCID(), &dispid); return dispid; }

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485