关于头文件和.nsmap的问题

shuitamen 2014-12-17 09:59:45
小弟遇到了一个问题,望大神解决。
现在有个这几个头文件
#include "A/soapH.h"
#include "A/***.nsmap"

#include "B/soapH.h"
#include "B/***.nsmap"

#include "C/soapH.h"
#include "C/***.nsmap"

因为某种需要,要进行统一,将所有需要进行gsoap通信的工作放在同一个.c文件里面执行。
但现在,每个soapH.h里面都定义了一个soap的结构体,用来进行开启gsoap通信,这样的话无疑会出现重定义的问题,遇到这样的问题应该怎么解决
...全文
293 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
panasonic0804 2014-12-17
  • 打赏
  • 举报
回复
soap的结构体定义文件的开头要么使用条件编译
#if/#endif
要么用
#pragma once
带gsoap-2.8源码,基于服务器客户端的实例,带自动生成服务客户端代码的批处理程序,及如何使用。带自己学习参考的教程; 0.解压附件,soapInterface.bat所在路径不得含中文 空格 1.新建头文件 取soapInterface.bat文件的同名:soapInterface.h 文件内编写接口,具体说明看附件参考的教程 //gsoap ns service name: gservice //gsoap ns service style: rpc int ns__add(int num1, int num2, int* result ); int ns__sub(int num1, int num2, int* result ); int ns__mult( int num1, int num2, int *result); int ns__divid( int num1, int num2, int *result); 2.从附件内gsoap-2.8包中搜索复制stdsoap2.h,stdsoap2.cpp,soapcpp2.exe, 存放于soapInterface.bat同级目录 3.双击soapInterface.bat运行。生成gClientSoap,gServerSoap两个文件夹,分别复制到服务器工程与客户端工程中使用 4.gClientSoap,gServerSoap两个文件夹内用到的文件功能说明,更多参考附件教程 1)soapC.cpp , soapH.h//soap的序列和反序列代码,它已经包含了soapStub.h 2)soapServer.c ppsoapServerLib.cpp //服务器端代码(纯C代码是soapServer.c soapServerLib.c ),soapServerLib.cpp文件则只是简单地包含soapServer.cpp和soapC.cpp 3)soapClient.cpp soapClientLib.cpp//客户端代码(纯C代码是soapClient.csoapClientLib.c ),soapClientLib.cpp文件则只是简单地包含soapClient.cpp和soapC.cpp 4) soapStub.h // soap的存根文件,定义了我们编写的头文件里对应的远程调用模型 5) add.nsmap //XML服务命名空间 6)服务器端要载入的文件有:soapServer.cpp,soapC.cpp,stdsoap2.cpp; 要包含的文件有:gservice.nsmap,soapH.h; 客户端要输入的文件有: soapClient.cpp,soapC.cpp,stdsoap2.cpp; 要包含的文件有:gservice.nsmap,soapH.h
C++实现56dxw短信验证码WebService接口。 编译工具gsoap-2.8.zip 因为长名字关系,请到根目录解压后再拷贝进来,直接解压可能会解压报错。 用VS.NET2003 开发游戏程序的时候,有一个登录功能模块,需要短信验证码。 56短信网有两种接口,一是HTTP,二是 Web Service。 短信验证码,采用HTTP接口,在客户端发送是不实际的,因为一是受制于客户端网络稳定性,二是容易被客户端拦截URL, 三是被拦截后,容易泄漏56短信网的帐号密码,导致被盗用,产生不安全因素。 服务端采用HTTP接口,也不是很好,服务端连接众多客户端,压力很大,如何有效执行URL和如何得到返回值都是问题。 服务端毕竟不是网站,需要及时有效响应。 因此,采用 服务端 + Web Service 方案很有必要。 其实,Web Service是什么,之前我也不懂,翻阅了大量百度后,知道SOAP这个东西来实现。 非常感谢这篇文章 http://hi.baidu.com/winnyang/blog/item/1138fad9bfac1be338012fdf.html 现在把我C++写的例子实现简单介绍下,与大家共享: 1、下载工具gsoap-2.8。gsoap是个好工具,包装了SOAP到C++的实现,不需要我们再辛苦。(例子中附带这个工具) gsoap-2.8.zip 因为长名字关系,请到根目录解压后再拷贝进来,直接解压可能会解压报错。 2、我例子目录下面有个文件夹gsoap,里面 soapcpp2.exe、wsdl2h.exe 、wsmap.dat、gsoap.bat、stdsoap2.h、stdsoap2.cpp 这几个文件不要删除。 其它文件可以删除,通过执行gsoap.bat重新生成。 3、执行gsoap.bat生成文件。 gsoap.bat内容: wsdl2h.exe -o 56dxw_webservice.h -t wsmap.dat -e http://jiekou.56dxw.com/WebServiceInterface.asmx?wsdl soapcpp2 -i -C -x 56dxw_webservice.h -I ..\gsoap-2.8\gsoap\import del /s /f /q WebServiceInterfaceSoap.nsmap.cpp rename WebServiceInterfaceSoap.nsmap WebServiceInterfaceSoap.nsmap.cpp 各参数意义稍微解释(网上复制): -t 定义std:string到C++中的字符串转化规则, 当前例子采用UNIOCDE编码编译,请在wsmap.dat 中加上 xsd__string = | std::wstring | std::wstring* 这句话 -o 文件名,指定输出头文件 -n 名空间前缀 代替默认的ns -c 产生纯C代码,否则是C++代码 -s 不要使用STL代码 -t 文件名,指定type map文件,默认为typemap.dat -e 禁止为enum成员加上名空间前缀 -C 仅生成客户端代码 -S 仅生成服务器端代码 -L 不要产生soapClientLib.c和soapServerLib.c文件 -c 产生纯C代码,否则是C++代码(与头文件有关) -I 指定import路径(见上文) -x 不要产生XML示例文件 -i 生成C++包装,客户端为xxxxProxy.h(.cpp),服务器端为xxxxService.h(.cpp)。 4、创建VS.NET2003对话框例子 (1)设置项目属性 设置 不使用预编译头 和 使用 Unicode 字符集(是否使用UNICODE根据项目实际情况,只要注意字符串转换) (2)项目中添加以下文件:注意,这些文件都是通过gsoap自动生成,无须修改。 stdsoap2.cpp stdsoap2.h soapC.cpp soapH.h WebServiceInterfaceSoap.nsmap.cpp soapWebServiceInterfaceSoapProxy.cpp soapWebServiceInterfaceSoapProxy.h (3)在对话框.h文件中 添加 #include "gsoap/soapWebServiceInterfaceSoapProxy.h" using namespace std; (4)在对话框.cpp文件中 添加 void Ctest2Dlg::OnBnClickedButton1() { #ifdef _UNICODE #define tstring wstring #else #define tstring string #endif WebServiceInterfaceSoapProxy gs; _ns1__SendNote SendSms; _ns1__SendNoteResponse Resp; CString str; GetDlgItemText(IDC_EDIT3,str); tstring handtels(str); tstring content(TEXT("验证码内容")); GetDlgItemText(IDC_EDIT1,str); tstring userName(str); //请测试人员此处直接输入用户名和密码 GetDlgItemText(IDC_EDIT2,str); tstring password(str); tstring cid(TEXT("713")); tstring sendtime(TEXT("")); tstring smsnumber(TEXT("1061")); SendSms.handtels = &handtels; SendSms._USCOREcontent = &content; SendSms.userName = &userName; SendSms.password = &password; SendSms.cid = &cid; SendSms._USCOREsendtime = &sendtime; SendSms._USCOREsmsnumber = &smsnumber; if(gs.SendNote(&SendSms;, &Resp;) == SOAP_OK) { int nReturn = Resp.SendNoteResult; switch( nReturn ) { case 1:str.Format(TEXT("发送成功"));break; case -1:str.Format(TEXT("用户名密码不正确"));break; case -2:str.Format(TEXT("内容不能大于70个字"));break; case -3:str.Format(TEXT("验证此平台是否存在"));break; case -4:str.Format(TEXT("提交号码不能为空或客户余额为0"));break; case -5:str.Format(TEXT("客户剩余条数不够要发送的短信数量"));break; case -6:str.Format(TEXT("非法短信内容"));break; case -7:str.Format(TEXT("返回系统故障"));break; case -8:str.Format(TEXT("网络性错误,请稍后再试"));break; default:str.Format(TEXT("未知错误"));break; } AfxMessageBox(str); } }

69,364

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧