前段时间由于工作需要,需要用c++创建dll 供其他程序通过dll调用webservice服务 ,现在抽空总结一下方法及注意的问题。至于怎么创建webservice服务以及发布 和IIS设置的相关问题 网上也有很多资料 我的另外两篇博客中也有相关介绍,不再赘述。
c++访问webservice有很多方法,各种方法也各有利弊,比较常用的就是web引用,比较方便,如果调用的服务地址需要经常改动,web引用不是很方便,但也是可以的 原理跟gsoap访问差不多,可以参考我的相关博文。
1、新建一个工程,点击工程名称右键->点击Add Web Reference 出现下图 在URL输入需要访问的服务地址 点GO即可列出服务内容,确定无误后点后边的 Add Reference 即可添加成功
2、添加成功后怎么使用
在工程cpp文件中添加头文件,添加成功后会自动添加一个WebService.h的头文件,其中包含了所有你添加的web服务头文件,并且产出重新添加web服务后,会自动重新添加,哪怕是同一个服务。如果你添加了3个web服务,其中就会包含你这三个服务的头文件。
3、声明使用的namespace
using namespace WebService1;
4、实例化服务中的类 即可使用了 使用之前要初始化组件
::CoInitialize(NULL) ;
CWebService1 ws;
BSTR bstr,strReturn;
bstr=_com_util::ConvertStringToBSTR(ptrPatid);
ws.GetPatientInfo(bstr,&strReturn);
strRes=_com_util::ConvertBSTRToString(strReturn);
即便你服务中传入参数是string类型的,调用的时候要转化为BSTR,你可以到你引用的服务的头文件中查看,其中有详细的定义说明。比如上面的例子中。服务名叫WebReference,在WebReference.h中包含了,你引用服务中所有的服务声明及定义,例子中实例化使用的是类CWebService1 头文件中都有定义。必须按头文件的定义来使用。这个类名其实也就是发布的服务中使用的类名。
总结:用web引用比较简单,注意的内容也就这么多,如果你需要多个引用,这些引用中的namespace 和 类名不能相同,不然无法使用。
附上一个简单的例子:
#include "stdafx.h"
#include "stdio.h"
#include "WebService.h"
#include "iostream"
//#include "comutil.h"
#include <comdef.h> //包含重载
using namespace std;
using namespace WebService1;
int _tmain(int argc, _TCHAR* argv[])
{
// 初始化com组件运行环境
::CoInitialize(NULL);
CWebService1 ws;
int nNum1 = 10;
int nNum2 = 10;
int nSum = 0;
HRESULT hr = ws.Sum(nNum1, nNum2, &nSum);
printf("The Sum of the two num is:%d\n",nSum);
BSTR b_msg = _com_util::ConvertStringToBSTR(" good luck!");
BSTR b_result;
hr=ws.HelloWorld(b_msg,&b_result);
// CString str(b_result);
cout << _com_util::ConvertBSTRToString(b_result) << endl;
getchar();
return 0;
}