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

向右看齐 2022-08-18 03:04 301阅读 0赞

远程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调用就完成了.

发表评论

表情:
评论列表 (有 0 条评论,301人围观)

还没有评论,来说两句吧...

相关阅读