由于在上传报警服务器过车数据时,第三方平台提供了webservice接口。以前用VC++2003做过调用webservice接口,直接在Project菜单下的add web Reference填入相关的名称,VC++2003会自动生成相关的类,在调用的地方只要定义一个实例就可以调用webservice接口了,但是在测试南通卡口数据上传项目时发现,编译时总是提示命名空间不对,后来查找资料发现webservice接口编写不规范会导致webservice接口的 namespace不对。我们不能要求第三方修改webservice接口,只能查找其他方法。于是通过soap调用webservice接口。以下是详细步骤:
1、首先下载安装soapsdk3.0
(http://download.microsoft.com/download/2/e/0/2e068a11-9ef7-45f5-820f-89573d7c4939/soapsdk.exe)。
2、在头文件中引入必要的库的,包含相应的命名空间
#import "msxml4.dll"
using namespace MSXML2;
#import "C:\Program Files\Common Files\MSSoap\Binaries\MSSOAP30.dll" \
exclude("IStream", "IErrorInfo", "ISequentialStream", "_LARGE_INTEGER", \
"_ULARGE_INTEGER", "tagSTATSTG", "_FILETIME")
using namespace MSSOAPLib30;
3、在cpp文件中调用soap提供的接口,直接贴代码
try
{
// 与Web服务连接
pDlg->Connector.CreateInstance(__uuidof(HttpConnector30));
// http://10.36.6.4/video/control.asmx?op=WriteTgclJl为调用页面,在URL里指定你的服务器名
pDlg->Connector->Property["EndPointURL"] = "http://10.36.6.4/video/control.asmx?op=WriteTgclJl";
pDlg->Connector->Connect();
// 开始消息,http://10.36.6.4/video/WriteTgclJl为响应函数,
pDlg->Connector->Property["SoapAction"] = "http://10.36.6.4/video/WriteTgclJl";
pDlg->Connector->BeginMessage(); //启动消息句柄
// 创建SoapSerializer对象
pDlg->Serializer.CreateInstance(__uuidof(SoapSerializer30));
//将 serializer 连接到 connector 的输入字符串
pDlg->Serializer->Init(_variant_t((IUnknown*)pDlg->Connector->InputStream));
// 创建ISoapReaderPtr对象
pDlg->Reader.CreateInstance(__uuidof(SoapReader30));
// 创建SOAP消息
pDlg->Serializer->StartEnvelope("","","");
// pDlg->Serializer ->StartEnvelope("","STANDARD","")