SOAP实例:客户端(C++) + 服务器端(Web + COM+)

远程soap服务器端有个com其中一接口是
HRESULT GetTemp([in]BSTR Url,[out,retval]BSTR*Return);
他的实现是
STDMETHODIMP cGetTime::GetTemp(BSTR Url, BSTR *Return)
{
 // TODO: Add your implementation code here
 *Return = SysAllocString(_T("jones"));
 return S_OK;
}

现在在客户端用soap调

#import "c:Program Filescommon FilesMSSoapBinariesmssoap30.dll" raw_interfaces_only, exclude("IStream", "ISequentialStream", "_LARGE_INTEGER", "_ULARGE_INTEGER", "tagSTATSTG", "_FILETIME", "IErrorInfo")
using namespace MSSOAPLib30; //soap的dll 

int main(int argc, char* argv[])
{
 coInitialize(NULL);
 _variant_t result;
 DISPID dispidFn=0;
 
 HRESULT hr;
 ISoapclientPtr pSoapclient;
 pSoapclient=ISoapclientPtr(__uuidof(Soapclient30));
 
 long lValue=10;
 try
 {
  //连接soap站点
  hr=pSoapclient->MSSoapInit(_bstr_t("http://192.168.100.171:8888/SoapTest.WSDL"),
   _bstr_t("SoapTest"),_bstr_t("GetTimeSoapPort"),NULL);
    if(FAILED(hr))
  {
   printf("MSSoapInit 失败rn");
   _com_issue_error(hr);
  }


  LPOLESTR pServiceName = L"GetTemp"; //得到com中的GetTemp的方法ID
  hr = pSoapclient->GetIDsOfNames(IID_NULL, &pServiceName, 1,
   LOcALE_SYSTEM_DEFAULT, &dispidFn);
  if(FAILED(hr))
  {
   printf("GetIDsOfNames 失败rn");
  }
  else
  {
    TcHAR strData[126]=;
   VARIANT args[1]=;
   args[0].vt = VT_BSTR;
   wsprintf(strData,"test");
   args[0].bstrVal = _bstr_t(strData).copy(); //传的参数 既BSTR Url ,如果有多个参数 那args[]就是传的参数的数组

   EXcEPINFO excepinfo=;
   DISPPARAMS params=;
   params.cArgs = 1;
   params.rgvarg= args;
   _variant_t result;  //返回的是BSTR *Return 即"jones"
   UINT uArgErr=0;
   //调用GetTemp的方法
   hr=pSoapclient->Invoke(dispidFn, IID_NULL, LOcALE_SYSTEM_DEFAULT,
     DISPATcH_METHOD, &params, &result, &excepinfo, NULL);
   if(FAILED(hr))
   {
    printf("Invoke 失败rn");
    _com_issue_error(hr);
   }
   else
   
  }
 }
 catch(_com_error& e)
 {
  TcHAR str[205]=;
  wsprintf(str,"%s,%s,%s,%d",e.Source(),e.Description(),
   e.ErrorMessage(),e.Error());
  
 }
 coUninitialize();
 return 0;
}

好了一个简单的soap调用就完成了.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值