原码如下:
#include <stdio.h>#include <iostream>
#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;void CallService()
{
   ISoapSerializerPtr Serializer;
   ISoapReaderPtr Reader;
   ISoapConnectorPtr Connector;
try
{
   // Connect to the service
   Connector.CreateInstance(__uuidof(HttpConnector));
   Connector->Property["EndPointURL"] = "http://longfei/service.asmx";
   Connector->Connect();   // Begin message
   //Connector->Property["SoapAction"] = "";
   Connector->Property["SoapAction"] = "http://longfei/mms/SendTextMessage";
   Connector->BeginMessage();   // Create the SoapSerializer
   Serializer.CreateInstance(__uuidof(SoapSerializer));   // Connect the serializer to the input stream of the connector
   Serializer->Init(_variant_t((IUnknown*)Connector->InputStream));   // Build the SOAP Message   Serializer->startEnvelope("http://schemas.xmlsoap.org/soap/envelope/","","");
   Serializer->startBody("");
   Serializer->startElement("SendTextMessage","http://gw.lele.com/mms/service.asmx/SendTextMessage","","");
      Serializer->startElement("SPNumber","","","");
   Serializer->writeString("11");
   Serializer->endElement();
      Serializer->startElement("password","","","");
   Serializer->writeString("11");
   Serializer->endElement();
      Serializer->startElement("from","","","");
   Serializer->writeString("11");
   Serializer->endElement();
      Serializer->startElement("to","","","");
   Serializer->writeString("11");
   Serializer->endElement();
      Serializer->startElement("servicesType","","","");
   Serializer->writeString("11");
   Serializer->endElement();
      Serializer->startElement("subject","","","");
   Serializer->writeString("11");
   Serializer->endElement();
      Serializer->startElement("text","","","");
   Serializer->writeString("11");
   Serializer->endElement();
   Serializer->endElement();
   Serializer->endBody();
   Serializer->endEnvelope();
   // Send the message to the web service
   Connector->EndMessage();         // Let us read the response
   Reader.CreateInstance(__uuidof(SoapReader));   // Connect the reader to the output stream of the connector
   Reader->Load(_variant_t((IUnknown*)Connector->OutputStream), "");   // Display the result
   printf("Answer: %s\n", (const char *)Reader->RPCResult->text);
}
catch(exception *ex)
{
std::cout << "Something wrong happened !" << ex->what   << std::endl<< std::endl;
}
}void main()
{
   CoInitialize(NULL);
   CallService();
   CoUninitialize();
}怎么我用vc++调用SOAP的时候怎么调用webservices的返回值为soap:server呀,是怎么回事!
谢谢!

解决方案 »

  1.   

    不是自己webservices返回的值!
      

  2.   

    搜索Microsoft SOAP Toolkit Version 2 Samples
    其中有一个例子
    // Display error message corrisponding to HRESULT.
    void CCalcCliRpcCppDlg::DisplayHResult(LPCTSTR pMessage, HRESULT hr)
    { if (hr != 0)
    {
    LPVOID lpMsgBuf;
    FormatMessage( 
    FORMAT_MESSAGE_ALLOCATE_BUFFER | 
    FORMAT_MESSAGE_FROM_SYSTEM | 
    FORMAT_MESSAGE_IGNORE_INSERTS,
    NULL,
    hr,
    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
    (LPTSTR) &lpMsgBuf,
    0,
    NULL 
    );
    CString Msg = pMessage;
    Msg += " ";
    Msg += (LPCTSTR)lpMsgBuf;
    MessageBox(Msg, "Error", MB_OK | MB_ICONEXCLAMATION);
    LocalFree(lpMsgBuf);
    }
    else
    {
    MessageBox(pMessage, "Error", MB_OK | MB_ICONEXCLAMATION);
    }

    }// Display fault information in SoapClient object.
    void CCalcCliRpcCppDlg::DisplayFault(LPCTSTR pMessage)
    { HRESULT hr; BSTR FaultString;
    hr = m_pSoapClient->get_faultstring(&FaultString);
    if( FAILED(hr) )
    {
    DisplayHResult(_T("Cannot get FaultString."), hr);
    return;
    } CString Msg = pMessage;
    Msg += " ";
    Msg += FaultString; SysFreeString(FaultString); MessageBox(Msg, "Error", MB_OK | MB_ICONEXCLAMATION);}// Connect to service specified in WSDL combo box. Actually
    // connects only if not already connected to service.
    bool CCalcCliRpcCppDlg::Connect()
    {

    HRESULT hr; CString NewWSDL;
    m_WSDLCtl.GetWindowText(NewWSDL); if(m_WSDLConnected != NewWSDL)
    {
    if (m_pSoapClient != NULL) m_pSoapClient.Release();
    hr = m_pSoapClient.CreateInstance(__uuidof(SoapClient));
    if(FAILED(hr))
    {
    DisplayHResult(_T("Cannot create SoapClient."), hr);
    return false;
    }
    hr = m_pSoapClient->mssoapinit((LPCTSTR)NewWSDL, _T(""), _T(""), _T(""));
    if(FAILED(hr))
    {
    DisplayFault(_T("Cannot initialize SoapClient. "));
    return false;
    }
    m_WSDLConnected = NewWSDL;
    } return true;}// Execute Add
    void CCalcCliRpcCppDlg::OnAdd() 
    {
    Execute(L"Add");
    }// Execute Divide
    void CCalcCliRpcCppDlg::OnDivide() 
    {
    Execute(L"Divide");
    }// Execute Multiply
    void CCalcCliRpcCppDlg::OnMultiply() 
    {
    Execute(L"Multiply");
    }// Execute Subtract
    void CCalcCliRpcCppDlg::OnSubtract() 
    {
    Execute(L"Subtract");
    }// Execute the specified method.
    void CCalcCliRpcCppDlg::Execute(OLECHAR *pMethodName)
    { if(Connect())
    { HRESULT hr;
    DISPID dispid;
    DISPPARAMS dispparams;
    VARIANTARG params[2];
    VARIANT result;
    CString ParamText;
    EXCEPINFO ExceptInfo; // Get dispatch ID corrisponding to method name.
    hr = m_pSoapClient->GetIDsOfNames(IID_NULL, &pMethodName, 1, LOCALE_SYSTEM_DEFAULT, &dispid);
    if(FAILED(hr))
    {
    DisplayHResult(_T("Cannot get dispatch id of calc method."), hr);
    return;
    } // Set B parameter.
    VariantInit(&params[0]);
    params[0].vt = VT_R8;
    m_BCtl.GetWindowText(ParamText);
    params[0].dblVal = atof(ParamText); // Set A parameter.
    VariantInit(&params[1]);
    params[1].vt = VT_R8;
    m_ACtl.GetWindowText(ParamText);
    params[1].dblVal = atof(ParamText); // Initialize DISPPARAMS structure.
    dispparams.cArgs = 2;
    dispparams.cNamedArgs = 0;
    dispparams.rgdispidNamedArgs = NULL;
    dispparams.rgvarg = params; // Prepare result variant.
    VariantInit(&result); // Invoke the specified method.
    hr = m_pSoapClient->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &dispparams, &result, &ExceptInfo, NULL);
    if(FAILED(hr))
    {
    DisplayFault(_T("Invoke of calc method failed."));
    }
    else
    { // Convert result to a string.
    VariantChangeType(&result, &result, 0, VT_BSTR); // Display result.
    m_ResultCtl.SetWindowText(CString(result.bstrVal)); } // Clean up variants.
    VariantClear(&result);
    VariantClear(&params[0]);
    VariantClear(&params[1]); }
    }