代码如下;
#include <stdio.h>
#include <iostream.h>#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;void Add()
{
   ISoapSerializerPtr Serializer;
   ISoapReaderPtr Reader;
   ISoapConnectorPtr Connector;
   // Connect to the service.
   Connector.CreateInstance(__uuidof(HttpConnector30));
   Connector->Property["EndPointURL"] = "http://www.wopos.com/webservice/weather.asmx";
   Connector->Connect();   // Begin the message.
   //Connector->Property["SoapAction"] = "uri:AddNumbers";
   Connector->Property["SoapAction"] = "http://tempuri.org/getWeather";
   Connector->BeginMessage();   // Create the SoapSerializer object.
   Serializer.CreateInstance(__uuidof(SoapSerializer30));   // Connect the serializer object to the input stream of the connector object.
   Serializer->Init(_variant_t((IUnknown*)Connector->InputStream));   // Build the SOAP Message.
   Serializer->StartEnvelope("","","");
   Serializer->StartBody("");
   Serializer->StartElement("getWeather","http://tempuri.org/getWeather","","");
   Serializer->StartElement("mCity","","","");
   Serializer->WriteString("济南");
   Serializer->EndElement();
   //Serializer->StartElement("NumberTwo","","","");
   //Serializer->WriteString("10");
   //Serializer->EndElement();
   Serializer->EndElement();
   Serializer->EndBody();
   Serializer->EndEnvelope();
   
   // Send the message to the XML Web service.
   Connector->EndMessage();      // Read the response.
   Reader.CreateInstance(__uuidof(SoapReader30));   // Connect the reader to the output stream of the connector object.
   Reader->Load(_variant_t((IUnknown*)Connector->OutputStream), "");   // Display the result.
   
   printf("Answer: %s\n", (const char*)Reader->RpcResult->xml);
}int main()
{
::CoInitialize(NULL);
   Add();
   CoUninitialize();
   return 0;
}

解决方案 »

  1.   

    以前用vc6,使用微软的SOAP SDK开发,根本不能用,连例子都是错的。还是用C#是上策,要么完全自己封装这个格式。VC6 + SOAP = 崩溃。
    http://www.cnblogs.com/babyblue/archive/2005/05/16/156160.html
      

  2.   

    楼上,不要误导别人,谁说 VC6 + SOAP = 崩溃 的?我虽然对 SOAP 了解的不多(比如楼主用的这么多的智能指针我都没用过),不过我试过简单的 WebService 调用,你可以试试:HRESULT hr = 0;
    ISoapClient *m_pSoapClient = NULL;//create soapclient object
    hr = ::CoCreateInstance(__uuidof(SoapClient30), NULL, CLSCTX_INPROC_SERVER, __uuidof(ISoapClient), (LPVOID *)&m_pSoapClient);
    if (m_pSoapClient == NULL)
    {
    IssueError(_T("Create soap client object fail"));
    return hr;
    }//init soap client
    try
    {
    _variant_t varWSDL = szWSDLFile;
    _variant_t varWSML = _T("");
    _bstr_t bstrService = szService;
    _bstr_t bstrPort = szPort;
    _bstr_t bstrNS = _T(""); hr = m_pSoapClient->MSSoapInit2(varWSDL, varWSML, bstrService, bstrPort, bstrNS);
    if (FAILED(hr))
    {
    IssueError(_T("Error calling MSSoapInit2"));
    }
    }
    catch (...)
    {
    IssueError(_T("Initialize web service failed."));
    hr = S_FALSE;
    }
      

  3.   

    谢谢各位,我认为不是初始化的问题,因为我调用另一个不需要传参数的方法时,是成功的,但是调用这个传参数的方法,一传参数Serializer->WriteString("济南");这里,就出现返回soap:Server的错误,感觉是传参数的问题!
      

  4.   

    可以试试 gSoap,我用的就是这个。