VC6采用SOAP访问WEBSERVICE

// SoapClientWrap.h: interface for the CSoapClientWrap class.
//
//

#if !defined(AFX_SOAPCLIENTWRAP_H__9C0644A3_B96D_47CF_B062_0D07A3F88998__INCLUDED_)
#define AFX_SOAPCLIENTWRAP_H__9C0644A3_B96D_47CF_B062_0D07A3F88998__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#import "msxml3.dll"
using namespace MSXML2;
#import "C:/Program Files/Common Files/MSSoap/Binaries/MSSOAP1.dll" exclude("IStream", "ISequentialStream", "_LARGE_INTEGER","_ULARGE_INTEGER", "tagSTATSTG", "_FILETIME")
using namespace MSSOAPLib;
typedef struct
{
 char * sParamName;
 char * sParamValue;
}WSPARAM;
//WSPARAM wsParam[20];
class CSoapClientWrap 
{
public:
 bool Invoke(char * wsURL,char * wsSoapAction,char * wsNameSpace,char * wsMethod,WSPARAM *wsParam,int wsCount,char * sEmsg,CString * sRmsg,bool wsXML);//sEmsg,出错消息,sRmsg,返回数据
 CSoapClientWrap();
 virtual ~CSoapClientWrap();
protected: 
 ISoapConnectorPtr SoapConnector;
 ISoapSerializerPtr Serializer;
 ISoapReaderPtr Reader;

};

#endif // !defined(AFX_SOAPCLIENTWRAP_H__9C0644A3_B96D_47CF_B062_0D07A3F88998__INCLUDED_)

 

 

CPP

// SoapClientWrap.cpp: implementation of the CSoapClientWrap class.
//
//

#include "stdafx.h"
//#include "WebService.h"
#include "SoapClientWrap.h"
#include "..//ChineseCodeLib.h"
#include <string>
using namespace std;
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//
// Construction/Destruction
//

CSoapClientWrap::CSoapClientWrap()
{

}

CSoapClientWrap::~CSoapClientWrap()
{
 try
 {
//  CoUninitialize();
 }
 catch(...)
 {
  ;
 }
}
//函数名 Invoke(char *wsURL,char * wsSoapAction,char *wsNameSpace, char *wsMethod, WSPARAM *wsParam, int wsCount,char * sEmsg,char * sRmsg)
//说明:按指定属性访问远程的WEBSERVICE,并返回给调用函数
//参数说明:
//   wsURL:WEBSERVICE的链接地址
//   wsSoapAction:在页面中可访问到的SoapAction;
//   wsNameSpace:在页面中定义的命名空间,一般地使用:http://tempuri.org/
//   wsMethod:要访问的WEBSERVICE 方法名
//   wsParam: 要使用的参数,见WSPARAM定义,
//   wsCount: 参数总数
//   sEmsg://要返回给调用函数的错误码率信息
//   sRmsg://要返回的捃执行结果信息
//返回值:
//   如果正常执行返回true,中间有问题就返回false;
//李浩
//2007-3-21日
//编写说明:
//为了让返回信息及调用信息一致,故将CoInitalize也在Invoke中
//   wsXML:要返回的是XML值还是TEXT

bool CSoapClientWrap::Invoke(char *wsURL,char * wsSoapAction,char *wsNameSpace, char *wsMethod, WSPARAM *wsParam, int wsCount,char * sEmsg,CString * sRmsg,bool wsXML)
{
 HRESULT hr;
 
 hr= CoInitialize(NULL);//初始化com环境
 if(FAILED(hr))
 {
  strcpy(sEmsg,"初始化COM失败");
  return false;
 }
 hr = SoapConnector.CreateInstance(__uuidof(HttpConnector));
 if(FAILED(hr))
 {
  //创建com对象出错,一般是因为没有安装com
  strcpy(sEmsg,"创建HttpConnector FAILED");
  return false;
 }
 SoapConnector->Property["EndPointURL"] = (LPTSTR)(LPCTSTR)wsURL;
 hr = SoapConnector->Connect();
 if (FAILED(hr))
 {
  strcpy(sEmsg,"连接WEBSERVICE FAILED");
  return false;
 }
 SoapConnector->Property["SoapAction"] = (LPTSTR)(LPCTSTR)wsSoapAction;  //保持为空字符串即可
 SoapConnector->BeginMessage();
 Serializer.CreateInstance(__uuidof(SoapSerializer));
 // 将serializer连接到connector的输入字符串
 Serializer->Init(_variant_t((IUnknown*)SoapConnector->InputStream));
 Serializer->startEnvelope("","","");
 //Serializer->startEnvelope("","","");
 Serializer->startBody("NONE");
 //要调用的函数名
 Serializer->startElement(wsMethod,wsNameSpace,"NONE","");
 //以下是为函数加入要调用的参数
 for(int i =0;i<wsCount;i++)
 {
  WSPARAM wsparam = wsParam[i];
  Serializer->startElement(wsparam.sParamName,wsNameSpace,"NONE","");
  string UTFValue;
  CChineseCodeLib myCode;
  myCode.GB2312ToUTF_8(UTFValue,wsparam.sParamValue,strlen(wsparam.sParamValue));
  Serializer->writeString(UTFValue.c_str());
  Serializer->endElement();
 }
 Serializer->endElement();
 Serializer->endBody();
 Serializer->endEnvelope();
 try
 {
  SoapConnector->EndMessage();
 }
 catch(...)
 {
  strcpy(sEmsg,"提交SOAP消息出错");
  return false;
 }
 hr = Reader.CreateInstance(__uuidof(SoapReader));
 if (FAILED(hr))
 {
  strcpy(sEmsg,"CreateInstance READER FAILED");
  return false;
 }
 Reader->Load(_variant_t((IUnknown*)SoapConnector->OutputStream), "");
 if (wsXML)
  sRmsg->Format("%s",(const char*)Reader->RPCResult->xml);
  //strcpy(sRmsg,);
 else
  sRmsg->Format("%s",(const char*)Reader->RPCResult->text);
  //strcpy(sRmsg,(const char*)Reader->RPCResult->text);
 
 return true;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值