Click here to Skip to main content
Click here to Skip to main content

SOAP Client: Using SOAP Toolkit 3.0

, 2 Nov 2003
Rate this:
Please Sign up or sign in to vote.
A SOAP client, using SOAP Toolkit 3.0.

Introduction

This article describes a project that provides a SOAP Client using SOAP Toolkit 3.0. It can be altered to use with SOAP Toolkit 2.0.

Using the code

The project is a Win32 console application. The user needs to change the method name as well as the path of the WSDL file.

Requirements

  • SOAP Toolkit 2.0 or 3.0
  • MSXML 4.0

Instructions to download as well as install these are present in the MSDN website.

//Code
HRESULT hRes = CoInitialize(NULL);

    ///////////////////NEW VERSION
    CString csMethodName="MEthodName";
    //OLECHAR FAR* fszMemberFunc[] = {L"MethodName"}; 
                    //Name of method being called


    LPOLESTR fszMemberFunc;
    IDispatch FAR* pdisp; //Pointer to IDispatch object
    DISPID dispid; //ID of method
    unsigned int uArgErr = 0;
    DISPPARAMS dispparams; //Parameter workarea
    EXCEPINFO excepinfo; //Exception Information
    HRESULT hresult; //return value, system functions
    VARIANT returnval; //return value(s) from server being called
    CString CEMessage;

    _bstr_t bstrWSDLFile
      (_T("http://xxx.xxx.xxx.xx/abcd/xyz/asaffsf.WSDL"));

    BSTR xmlInput;
    CString tempValue= "<TEST>Hi there</TEST>";
    xmlInput= tempValue.AllocSysString();



    dispparams.rgvarg = NULL;
//  CComPtr<ISOAPClient> m_ptrSoapClient;
    CComPtr<ISoapClient> m_ptrSoapClient;//For SOAPTOOLKIT 3.0
    try
    {
        hresult = AnsiToUnicode(csMethodName,&fszMemberFunc); 

        if(S_OK!=hresult)
        {
            CEMessage.Format("Unable to execute AnsiToUnicode"
                " for ProgID %s, with Error : %d",
                csMethodName, hresult);
            throw (CEMessage);
            //error converting the method anme
        }
        hresult=-1;
        //For SOAPTOOLKIT 2.0
    //  hresult = 
          m_ptrSoapClient.CoCreateInstance(__uuidof(SoapClient));
        //For SOAPTOOLKIT 3.0
        hresult = m_ptrSoapClient.CoCreateInstance(__uuidof(SoapClient30));
        if (S_OK != hresult)    {

            CEMessage.Format("CoCreateInstance failed for"
                   " SOAP CLIENT  with the Error : %d",
                    hresult);
            throw (CEMessage); //error creating an instance 
        }
        _bstr_t tmp(_T(""));
        hresult=-1;

        hresult = m_ptrSoapClient->MSSoapInit(bstrWSDLFile, 
                              "","","");//For SOAPTOOLKIT 3.0
//      hresult = m_ptrSoapClient->mssoapinit(bstrWSDLFile,
                              "","","");//For SOAPTOOLKIT 2.0

        if (S_OK != hresult) {

            CEMessage.Format("Initialization failed"
                    " for SOAP Client  with Error : %d", 
                    hresult);
            throw (CEMessage);
        }//Falied to inialize


        //    GetID of Member Function Being called
        hresult = -1;

        hresult = m_ptrSoapClient->GetIDsOfNames(IID_NULL, 
                    &fszMemberFunc, 1,    
                    LOCALE_SYSTEM_DEFAULT, &dispid);
        if (S_OK != hresult) {

            CEMessage.Format("GetIDsOfNames failed for"
              " ProgID SoapClient, Function Name %s,  with Error : %d", 
              fszMemberFunc,hresult);
            throw (CEMessage);
        }

        //Now setup arguments for transfer to server
        dispparams.rgvarg = new VARIANTARG[1];

        if (NULL == dispparams.rgvarg)
            throw ("Unable to allocate from the heap");

        dispparams.cArgs = 1;
        dispparams.cNamedArgs = 0;
        dispparams.rgdispidNamedArgs = NULL;
        dispparams.rgvarg[0].vt = VT_BYREF|VT_BSTR;
        dispparams.rgvarg[0].pbstrVal = &xmlInput;     

        //Setup initial conditions and Invoke Call
        VariantInit(&returnval);
        excepinfo.wCode = 0;
        excepinfo.bstrSource = NULL;
        excepinfo.bstrDescription = NULL;
        excepinfo.bstrHelpFile = NULL;
        hresult = -1;
        hresult = m_ptrSoapClient->Invoke(dispid, IID_NULL, 
                    LOCALE_USER_DEFAULT, DISPATCH_METHOD,
                    &dispparams, &returnval, &excepinfo, &uArgErr);


        if (S_OK != hresult) {
            if (DISP_E_EXCEPTION == hresult) {

                char src[256];
                char dsc[256];
                DWORD iLengthS = 
                   SysStringByteLen (excepinfo.bstrSource);
                DWORD iLengthD = 
                   SysStringByteLen (excepinfo.bstrDescription);
                WideCharToMultiByte(CP_ACP, NULL, 
                    excepinfo.bstrSource,iLengthS, 
                    src, sizeof(src), NULL, NULL);
                WideCharToMultiByte(CP_ACP, NULL, 
                    excepinfo.bstrDescription,iLengthD, 
                    dsc, sizeof(dsc), NULL, NULL);
                CEMessage.Format("exceptinfo: bstrSource '%s', 
                    bstrDescription '%s', wCode '%d'", 
                    src, dsc, excepinfo.wCode);
                //
            }

            bstr_t faultString=m_ptrSoapClient->GetFaultString();
            CString tempFaultString=(LPCSTR)faultString;
            bstr_t  detail=m_ptrSoapClient->GetDetail();
            CString tempfaultdetail=(LPCSTR) detail;
            CEMessage.Format("IDispatch.Invoke() failed for"
                 " ProgID SoapClient, Function Name %s  with HRESULT"
                 "   %d  FaultString %s and FaltDetails %s", 
                 csMethodName,hresult,tempFaultString,tempfaultdetail);
            throw (CEMessage);
        }

        CString temp= returnval.bstrVal;//temp has the results

        SysFreeString(xmlInput);;
    }
    catch (CString& csMsg)
    {
        SysFreeString(xmlInput);

    }
    catch (CException* pException)
    {
        SysFreeString(xmlInput);
        char msg[256];
        pException->GetErrorMessage(msg,sizeof(msg),NULL);

        delete pException;
    }
    catch (...)
    {
        SysFreeString(xmlInput);
    }

    if (m_ptrSoapClient)
    {
        m_ptrSoapClient.Release();
        pdisp = NULL;
    }
    if (NULL != dispparams.rgvarg)
        delete [] dispparams.rgvarg;
    CoUninitialize();

//

Points of interest

Couple of points which are worth mentioning:

  1. In case the user encounters this error:
    exceptinfo: bstrSource 'Connector', bstrDescription 
      'Connector:Connection time out. 
    HRESULT=0x800A1527 - Client:An unanticipated error occurred 
      during the processing of this request. 
    HRESULT=0x800A1527 - Client:Sending the Soap message failed or no 
      recognizable response was received 
    HRESULT=0x800A1527 - ClieConnector', wCode '0'

    Bump up the timeout. It might fix it.

  2. If WinINET connector to be used instead of WinHTTP, rename/delete whsc30.dll under program files\common files\MSSoap\Binaries.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

Share

About the Author

Vipul Bansal

United States United States
No Biography provided

Comments and Discussions

 
QuestionVT_Dispatch to BSTR conversion issue PinmemberMember 267324721-Aug-11 21:58 
Questionhow to pass base64binary Pinmemberrsobies1-Oct-06 22:49 
QuestionSOAP Error PinmemberSolomonGnanaraj5-Aug-06 3:04 
AnswerRe: SOAP Error Pinmemberjlclua25-Sep-06 15:06 
Questionerror in the client Pinmemberjamni12319-Jul-06 18:31 
QuestionRe: error in the client PinmemberSolomonGnanaraj5-Aug-06 3:03 
Generalthis code example Pinmemberjohncodep22-Jun-06 9:11 
QuestionUrgent Help:How to Use ProxyPort and Proxy Server Pinmembermardan mustak12-Apr-06 2:49 
QuestionHi.. what about Dataset as a return value?? Pinmemberwalrusman29-Nov-05 19:11 
Generalsolution for 0x800A1527 Pinmemberprosagar8-Sep-05 22:36 
GeneralRe: solution for 0x800A1527 Pinsussamccool9-Sep-05 15:10 
GeneralRe: solution for 0x800A1527 PinmemberSrinivasV5-Jan-06 0:59 
GeneralRe: solution for 0x800A1527 Pinmemberdewins10-May-12 7:33 
Generalsh SOAP Toolkit 3.0 Pinsussmkharwadkar31-Jul-05 21:47 
QuestionHow to get method names of the web service Pinmembergrinder13-Mar-05 22:49 
GeneralSOAP C++ PinmemberPierre Cloutier6-Mar-05 3:53 
GeneralRe: SOAP C++ Pinmemberz11aalex17-Dec-08 6:02 
QuestionHELP ME!!!why toolkit3.0 generate these bad XML for me? Pinmembergxulg16-Jan-05 20:05 
AnswerRe: HELP ME!!!why toolkit3.0 generate these bad XML for me? Pinmembermehdi_tn12-Jul-05 23:31 
QuestionHTTPS? PinmemberNirav Doshi23-Sep-04 8:13 
AnswerRe: HTTPS? Pinmembernguyen Ngoc Tuan8-Jan-07 16:12 
AnswerRe: HTTPS? PinmemberNirav Doshi8-Jan-07 22:04 
QuestionRe: HTTPS? PinmemberSRANI9-Jun-08 6:00 
AnswerRe: HTTPS? PinmemberNirav Doshi9-Jun-08 6:44 
QuestionRe: HTTPS? PinmemberSRANI9-Jun-08 11:16 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web04 | 2.8.150123.1 | Last Updated 3 Nov 2003
Article Copyright 2003 by Vipul Bansal
Everything else Copyright © CodeProject, 1999-2015
Layout: fixed | fluid