1.首先我们粗略地介绍一下gSOAP的功能:
gSOAP编译工具提供了一个SOAP/XML 关于C/C++ 语言的实现,从而让C/C++语言开发web服务或客户端程序的工作变得轻松了很多。绝大多数的C++web服务工具包提供一组API函数类库来处理特定的SOAP数据结构,这样就使得用户必须改变程序结构来适应相关的类库。与之相反,gSOAP利用编译器技术提供了一组透明化的SOAP API,并将与开发无关的SOAP实现细节相关的内容对用户隐藏起来。
/**********************************************************************************************
编写头文件的几种特殊情况的处理已经注意点
1.所有的接口函数的名字必须以ns__开头
2.最后一个参数必须以指针或者引用的方式传递,作为客户端的返回值
3.需要传递的参数类型是一个结构体的时候,必须先要定义一个结构体 ,而且结构体的名字必须以ns__开头
4.当没有传入参数的时候参数类型定义为 void* 即可
***********************************************************************************************/
//登录接口
int ns__Login(char* strUserID, char* strPwd, wchar_t*& iLoginInfo);
//删除会议室预定信息
int ns__DeleteBoardedRoomInfo(char* strMeetingID, int& iResult);
//增加可以被使用的会议室 (操作权限:管理员)
int ns__AddRoom(char* strRoomID, char* strRoomName, int& iResult);
//根据时间查询会议室预定情况信息
int ns__SearchBoardedRoomInfoByTime(char* strTime, wchar_t*
2) gSOAP 的安装可以参考:http://wenku.baidu.com/view/68e0fb1252d380eb62946d8e.html 里面有很详细的步骤。

//能够远程读取wsdl文件
int http_get(struct soap * soap)
{
if (0 != strcmp(soap->path, "/ns.wsdl")) //判断path路径是否是/ns.wsdl路径
{
return SOAP_GET_METHOD;
}
//读取硬盘wsdl文件
CString cstrWsdlName = CPublicFunction::GetWsdlName(); //CPublicFunction这个类是一个公共函数类
CString cstrWsdlPath = CPublicFunction::GetWsdlPath();
CString cstrWsdl = cstrWsdlPath + cstrWsdlName;
CMarkup xmlWsdl; //这个类的是用来操作xml的类
string strWsdl;
if(xmlWsdl.Load(cstrWsdl))
{
strWsdl = xmlWsdl.GetDoc();
cout << strWsdl.c_str() <<endl;
}
soap->http_content = "xml";
soap_response(soap, SOAP_FILE);
soap_send_raw(soap, strWsdl.c_str(), strWsdl.length());
soap_end_send(soap);
return SOAP_OK;
}
并在主函数中写下如:
int _tmain(int argc, _TCHAR* argv[])
{
CDataBase db;
if (!db.OpenDatabase())//登陆数据库
{
return -1;
}
cout<<endl;
CString cstrSQL("select 姓名 from Student id='18'");//删除数据库
_RecordsetPtr dbtest;
dbtest = db.OpenReocrdset(cstrSQL);
db.CloseRecordset(dbtest);
string result = cstrSQL;
cout << result <<endl;
calc.imode |= SOAP_C_UTFSTRING;
calc.omode |= SOAP_C_MBSTRING;
calc.fget = http_get;
atexit(doDestory);
if (!(argc < 2))
{
// serve as CGI application
calc.serve();
calc.destroy();
}
if (calc.run(9999))
{
calc.soap_stream_fault(std::cerr);
}
calc.destroy();
return 0;
}
并把要包含的文件包含进来!
5)现在就是要写自己要操作数据库的函数了,一登陆Login()函数我里,其他的方法类似,这里就不在叙述了。
/*****************************************************************************
函数名 : Login
功能描述 : 根据用户输入的用户ID和用户密码登录会议室系统
输入参数 : strUserID strPwd
输出参数 : iLoginInfo
返回值 : 非0:参数不对或者密码不正确,0:查询成功
日 期 : 2011年2月21日
作 者 : xgc803
*****************************************************************************/
int Service::Login(char *strUserID, char *strPwd,wchar_t*& StrLoginInfo)
{
wchar_t WcharBuffer[WCHAR_MAX];
memset(WcharBuffer,0,WCHAR_MAX);
wchar_t* wchar_tArray = (wchar_t*)WcharBuffer;
//StrLoginInfo = "OK";
string username = strUserID;
string userPwd = strPwd;
if (username == "sa" && userPwd == "12345")
{
MBToWCHAR(wchar_tArray, "登陆成功", strlen("登陆成功"));
CDataBase db;
if (!db.OpenDatabase())
{
return -1;
}
}
else
{
MBToWCHAR(wchar_tArray,"登陆失败",strlen("登陆失败"));
}
StrLoginInfo = (wchar_t*)wchar_tArray;
return SOAP_OK;
}
为了让客服端能成功访问服务端,并通过服务端访问到数据库,还需要做如下几件事:
(1)修改配置文件,以.ini" 结尾的文件如
[ConfigInfo]
WSDL_NAME=ns.wsdl
WSDL_PATH=E:\study file\newweb\Debug\
注:结尾一定要以“\”结尾。
(2) 修改wsdl文件中的iP地址为正确的服务端的ip地址,并关闭防火墙,如图:
