www.pudn.com > vcrope_src.zip > sample.cpp
//******************************************************************* // AUTHOR: Catalin Hatmanu // PROJECT: vcrope // DATE: 23.12.2000 // COMMENTS: -SOAP sample C++ client; contain // methods based on wire transfer technique // ( MS SOAP Toolkit required) // Portions of code from Pedro Santos//******************************************************************* // Includes // RopeTeste.cpp : Defines the entry point for the console application. // #include #include #include //replace with the path of rope.dll #import "F:\\Program Files\\SOAP_Toolkit\\ROPE\\rope.dll" named_guids raw_interfaces_only #include //MS demo server CComBSTR bstrLocation = CComBSTR("http://www.soaptoolkit.com/soapdemo/services.xml"); //strings for preserving the service description and URI listener between calls CComBSTR bstrSrvDesc, URI_LISTENER; bool Connect() { long nSuccess, item = 0; CComVariant varTemp; ROPE::ISOAPPackagerPtr packer; CComPtr pIUnknown; ROPE::IServiceDescriptorsPtr pIServiceDescriptors; ROPE::ISDEndPointInfoPtr pISDEndPointInfo; USES_CONVERSION; try { HRESULT hr = packer.CreateInstance( ROPE::CLSID_SOAPPackager ); //load service description from this web service hr = packer->LoadServicesDescription(ROPE::icURI, bstrLocation, NULL, &nSuccess); if( nSuccess != 1 ) throw E_FAIL; //get service descriptors hr = packer->get_GetServiceDescriptors(ROPE::icENDPOINTINFO, &varTemp); pIUnknown.Attach( varTemp.pdispVal ); pIUnknown.QueryInterface( &pIServiceDescriptors ); //get first descriptor on the list VariantInit(&varTemp); hr = pIServiceDescriptors->get_Item(variant_t(item),&varTemp); pIUnknown.Detach(); //get the endpoint(URI address) a.e. where the SOAP message will be sent pIUnknown.Attach( varTemp.pdispVal ); hr = pIUnknown.QueryInterface( &pISDEndPointInfo ); hr = pISDEndPointInfo->get_URI(&URI_LISTENER); //get the service description hr = packer->get_ServicesDescription(&bstrSrvDesc); } catch(...) { std::cout << "Connection failure ! "<< std::endl; return false; } std::cout << "Connection successfull "<< std::endl; return true; } void GetStockMethod() { long nSuccess; CComBSTR bstrRequestStruct, bstrRequestPayload, bstrResponsePayload; //CComVariant varPrice; ROPE::ISOAPPackagerPtr packer; ROPE::IWireTransferPtr wireTrans; USES_CONVERSION; try { HRESULT hr = packer.CreateInstance( ROPE::CLSID_SOAPPackager ); //load service description using the string from previous Connect method call hr = packer->LoadServicesDescription(ROPE::icSTRING, bstrSrvDesc, NULL, &nSuccess); if( nSuccess != 1 ) throw E_FAIL; //seek in the service description //the method structure a.e. what we need to call this method hr = packer->GetMethodStruct(CComBSTR("GetStockQuote"), ROPE::icINPUT, &bstrRequestStruct); // set method name hr = packer->SetPayloadData(ROPE::icREQUEST, CComBSTR(""), CComBSTR("GetStockQuote"), bstrRequestStruct); //set method parameters hr = packer->SetParameter( ROPE::icREQUEST, CComBSTR("Symbol"), CComVariant("MSFT") ); hr = packer->SetParameter( ROPE::icREQUEST, CComBSTR("description"), CComVariant("any company") ); //get the data that will be sended to web server( payload ) hr = packer->GetPayload( ROPE::icREQUEST, &bstrRequestPayload); std::cout << W2A(bstrRequestPayload) << std::endl << std::endl; //post the payload wireTrans.CreateInstance( ROPE::CLSID_WireTransfer); hr = wireTrans->AddStdSOAPHeaders(URI_LISTENER,CComBSTR("GetStockQuote"),bstrRequestPayload.Length()); hr = wireTrans->PostDataToURI(URI_LISTENER, bstrRequestPayload, &bstrResponsePayload); std::cout << W2A(bstrResponsePayload) << std::endl << std::endl; //this is the response from service hr = packer->SetPayload( ROPE::icRESPONSE, bstrResponsePayload); //get return value CComVariant varPrice; hr = packer->GetParameter( ROPE::icRESPONSE, CComBSTR("result"), &varPrice); std::cout << W2A(varPrice.bstrVal) << std::endl; } catch(...) { std::cout << "Something wrong happened !" << std::endl<< std::endl; } } int main() { CoInitialize(NULL); Connect(); GetStockMethod(); CoUninitialize(); return 0; }