原码如下:
#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呀,是怎么回事!
谢谢!
#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呀,是怎么回事!
谢谢!
其中有一个例子
// 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(¶ms[0]);
params[0].vt = VT_R8;
m_BCtl.GetWindowText(ParamText);
params[0].dblVal = atof(ParamText); // Set A parameter.
VariantInit(¶ms[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(¶ms[0]);
VariantClear(¶ms[1]); }
}