Click here to Skip to main content
Licence 
First Posted 2 Nov 2003
Views 160,714
Bookmarked 26 times

SOAP Client: Using SOAP Toolkit 3.0

By | 2 Nov 2003 | Article
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

About the Author

Vipul Bansal



United States United States

Member



Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board. (secure sign-in)
 
Search this forum  
 FAQ
    Noise  Layout  Per page   
  Refresh
QuestionVT_Dispatch to BSTR conversion issue PinmemberMember 267324720:58 21 Aug '11  
Questionhow to pass base64binary Pinmemberrsobies21:49 1 Oct '06  
QuestionSOAP Error PinmemberSolomonGnanaraj2:04 5 Aug '06  
AnswerRe: SOAP Error Pinmemberjlclua14:06 25 Sep '06  
Questionerror in the client Pinmemberjamni12317:31 19 Jul '06  
QuestionRe: error in the client PinmemberSolomonGnanaraj2:03 5 Aug '06  
Generalthis code example Pinmemberjohncodep8:11 22 Jun '06  
QuestionUrgent Help:How to Use ProxyPort and Proxy Server Pinmembermardan mustak1:49 12 Apr '06  
QuestionHi.. what about Dataset as a return value?? Pinmemberwalrusman18:11 29 Nov '05  
Generalsolution for 0x800A1527 Pinmemberprosagar21:36 8 Sep '05  
GeneralRe: solution for 0x800A1527 Pinsussamccool14:10 9 Sep '05  
GeneralRe: solution for 0x800A1527 PinmemberSrinivasV23:59 4 Jan '06  
GeneralRe: solution for 0x800A1527 Pinmemberdewins6:33 10 May '12  
Generalsh SOAP Toolkit 3.0 Pinsussmkharwadkar20:47 31 Jul '05  
QuestionHow to get method names of the web service Pinmembergrinder21:49 13 Mar '05  
GeneralSOAP C++ PinmemberPierre Cloutier2:53 6 Mar '05  
GeneralRe: SOAP C++ Pinmemberz11aalex5:02 17 Dec '08  
QuestionHELP ME!!!why toolkit3.0 generate these bad XML for me? Pinmembergxulg19:05 16 Jan '05  
AnswerRe: HELP ME!!!why toolkit3.0 generate these bad XML for me? Pinmembermehdi_tn22:31 12 Jul '05  
QuestionHTTPS? PinmemberNirav Doshi7:13 23 Sep '04  
AnswerRe: HTTPS? Pinmembernguyen Ngoc Tuan15:12 8 Jan '07  
AnswerRe: HTTPS? PinmemberNirav Doshi21:04 8 Jan '07  
QuestionRe: HTTPS? PinmemberSRANI5:00 9 Jun '08  
AnswerRe: HTTPS? PinmemberNirav Doshi5:44 9 Jun '08  
QuestionRe: HTTPS? PinmemberSRANI10:16 9 Jun '08  

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.

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