现在的位置: 首页 > 综合 > 正文

gSoap

2018年06月07日 ⁄ 综合 ⁄ 共 5463字 ⁄ 字号 评论关闭


1 Gsoap 使用

     下载gsoap (gsoap-2.8)(版本 for CE DVICE改进版)址(:http://sourceforge.net/projects/gsoap2/)

  1. 解压(E:\Development\cpp\gsoap-2.8)
  2. 打开“命令提示符”(开始-附件)(又没用过的东东......)

       3.1 定位到目录(E:\Development\cpp\gsoap-2.8\gsoap\bin\win32)(命令 e: 回车;cd E:\Development\cpp\gsoap-2.8\gsoap\bin\win32)

     4. 命令: wsdl2h -s -o testhello.h htttp://192.169.0.110/MobileService/Service.asmx?wsdl

       在win32 文件夹下 生成testhello.h

     5 soapcpp2testhello.h -I D:\gsoap-2.7\gsoap\import 

生成一大推文件,其中有用的文件  (soapH.h ; soapStub.h ; soapC.cpp ; soapClient.cpp  ;ServiceSoap.namap; stdsoap2.h;stdsoap2.cpp);其中 stdsoap2.h;stdsoap2.cpp 在gsoap 文件夹下

6. 将上面文件复制到 MW 工程目录下


http://www.cnblogs.com/marky/archive/2012/05/13/2498263.html

若出现错误“atal error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "stdafx.h
解决方案
1) 在解决方案资源管理器中,右击相应的.cpp文件,点击“属性”2) 在左侧配置属性中,点开“C/C++”,单击“预编译头”
3) 更改右侧第一行的“创建/使用预编译头”,把选项从“使用预编译头(/Yu)”改成“不使用预编译头”
4) 注:每一个报错的.cpp都要如此更改


http://blog.csdn.net/magictong/article/details/6198545

Xdebug
Errors: xdebug(32) : error C2365: 'operator new' : redefinition; previous definition was 'function'

    在_DEBUG下new被重定义了(用来检测内存泄漏),然后查了下自己的代码,发现也有new的新定义……,因为之前是从MFC下面迁移过来的代码:

  1. #ifdef _DEBUG  
  2. #define new DEBUG_NEW  
  3. #undef THIS_FILE  
  4. static char THIS_FILE[] = __FILE__;  
  5. #endif  

      杯具……又是混用MFC和标准库造成的。

 

      解决方法也就明朗了。

      方法一:把所有文件里面上面的那一堆“……#define new DEBUG_NEW……”全部删除

      方法二:要么就保证使用了new的语句在上面的那一坨宏的前面。

      个人建议还是全删了吧。


VS 下 error PRJ0003 : 生成“cmd.exe”时出错   解决方法

 

一直被一个问题所困扰,那就是即使是用向导生成的工程,什么代码也不写,直接编译运行就报错:“error PRJ0003 : 生成 cmd.exe 时出错” 。
具体如下:

1>------ 已启动生成: 项目: Project1, 配置: Debug Win32 ------
1>正在链接...
1>正在嵌入清单...
1>项目 : error PRJ0003 : 生成“cmd.exe”时出错。
1>生成日志保存在“file://e:/C++Proj/Project1/Project1/Debug/BuildLog.htm”
1>Project1 - 1 个错误,0 个警告
========== 生成: 0 已成功, 1 已失败, 0 最新, 0 已跳过 ==========


MSDN上提示错误的可能原因为:

系统资源不足。关闭一些应用程序以解决此问题。

没有足够的安全特权。验证是否有足够的安全特权。

VC++ 目录中指定的可执行路径不包括您正尝试运行的工具的路径。

对于生成文件项目,缺少要在“生成命令行”或“重新生成命令行”上运行的命令。


查了查资料,看到解释是:VS2008的环境变量设置不对(但是怎么会不对的呢?之前不是挺好的吗)

应该如下解决:“工具--选项--项目和解决方案--VC++ 目录”
增加如下几行:
$(SystemRoot)/System32
$(SystemRoot)
$(SystemRoot)/System32/wbem

如果没有找到“项目和解决方案”,则勾选“工具”-“选项”里的“显示所有设置”(不过我没有看到这个“显示所有设置”的选项,当然“项目和解决方案”是直接就有的)。

这个是英文版本的
tools=> Options => Projects and Solutions -> VC++ Directories page 
then place below rows: 
$(SystemRoot)/System32
$(SystemRoot)
$(SystemRoot)/System32/wbem 

 


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/duqi_2009/archive/2011/03/31/6291685.aspx



用gSOAP开发Web Service程序--初级知识(转载)

gSOAP是一个绑定SOAP/XML到C/C++语言的工具,使用它可以简单快速地开发出 SOAP/XML的服务器端和客户端。由于 gSOAP具 有相当不错的兼容性,通过gSOAP,我们就可以调用由Java, .Net, Delhpi, PHP等语言开发的SOAP服务,或者向它们提供SOAP服务。

gSOAP的主页是:http://sourceforge.net/projects/gsoap2

下载解压后,可以在gsoap\bin\win32里 找到wsdl2h.exe和soapcpp2.exe(另外还有linux和mac版本)。

  • wsdl2h.exe的作用是根据WSDL生成C/C++风格的头文件
  • soapcpp2.exe的作用是根据头文件自动生成调用远程 SOAP服务的客户端代码(称为存根:Stub)和提供SOAP服务的框架代码(称为框架:Skeleton),另外它也能从头文件生成WSDL文件。

gsoap\stdsoap2.cpp则是gSOAP的核心代码,要使用 gSOAP只要在项目里包含这个文件以及由soapcpp2.exe生成的代码即可。

另外还有个stdsoap2.c,内容与stdsoap2.cpp一 模一样,用于纯C项目。

gSOAP两大工具的用法从WSDL中产生头文件用法:wsdl2h -o 头文件名 WSDL文件名或URLwsdl2h常用选项

  • -o 文件名,指定输出头文件
  • -n 名空间前缀 代替默认的ns
  • -c 产生纯C代码,否则是C++代码
  • -s 不要使用STL代码
  • -t 文件名,指定type map文件,默认为typemap.dat
  • -e 禁止为enum成员加上名空间前缀

typemap.dat文件用于指定SOAP/XML中的类型与C/C++之间的转换规则,比如在wsmap.dat里写

xsd__string = | std::wstring | wchar_t*

那么SOAP/XML中的string将转换成std::wstring或wchar_t*,这样能更好地支持中文。

例:

wsdl2h -o ayandy.h -n ay -t wsmap.dat http://www.ayandy.com/Service.asmx?WSDL

http://www.ayandy.com/Service.asmx?WSDL 生成ayandy.h文件,名空间为ay,使用wsmap.dat指定的转换规则。

wsdl2h.exe 生成的头文件里的变量、类型等名称的前面都会加上名空间前缀,以两个下划线分隔。如上面的命令生成的头文件,有这样的定 义:

  1. class ay1__ArrayOfString;
  2. enum ay1__theDayFlagEnum
  3. {
  4.  ay1__theDayFlagEnum__Today,
  5.  ay1__theDayFlagEnum__Tomorrow,
  6.  ay1__theDayFlagEnum__theDayafterTomorrow,
  7. };

前面的ayandy1__的是名空间前缀,用以防止名称冲突。

wsdl2h的-n选项可以改变这个名空间前缀(默认为ns),对于枚举ay1__theDayFlagEnum内 的成员,如果嫌它太长的话,可以用-e命令选项禁止加入名空间前缀。

从头文件生成存根(stub)和框架(Skeleton)源文件

编写SOAP程序除了头文件是不够的,还要有连接、通信、XML解析、序列/反序列化等工作。gSOAP提供的socapcpp2.exe就 是用于从头文件中生成这些代码的,我们只要关心真正的业务逻辑就行了。

用法soapcpp2 头文件例:soapcpp2 ayandy.h

将生成下面这些文件

  • soapStub.h    // soap的存根文件,定义了ayandy.h里对应的远程调用模型
  • soapC.c soapH.h  // soap的序列和反序列代码,它已经包含了soapStub.h,服务器端与客户端都要包含它
  • soapClient.c soapClientLib.c // 客户端代码,soapClientLib.c文件则只是简单地包含soapClient.c和soapC.c
  • soapServer.c soapServerLib.c // 服务器端代码,soapServerLib.c文件则只是简单地包含soapServer.c和soapC.c
  • ServiceSoap.nsmap ServiceSoap12.nsmap // 名空间定义,服务器端与客户端都要包含它
  • soapServiceSoapProxy.h soapServiceSoap12Proxy.h // 客户端的C++简单包装(如果头文件是纯C代码,这两个文件就不会生成)

综上所述

  • 如果编写服务器端,项目里应该加入soapServer.c或者soapServer.cpp,代码里包含头文件soapH.h
  • 如果编写客户端,项目里应该加入soapClient.c或者soapClient.cpp,代码里包含头文件SoapH.h(或xxxxProxy.h)
  • 当然,还要加入gsoap库里的stdsoap2.cpp文件(如果是写C代码,则加入stdsoap2.c)

如果看到soapcpp2提示:”Critical error: #import: Cannot open file "stlvector.h" for reading.“, 那是因为我们的头文件使用了STL(wsdl2h 没用-s选项),这时要使用-I选项指定gSOAP的 import文件路径,这个路径是"$gsoap\gsoap\import":

soapcpp2 ayandy.h -I D:\gsoap-2.7\gsoap\importsoapcpp2常用选项

  • -C 仅生成客户端代码
  • -S 仅生成服务器端代码
  • -L 不要产生soapClientLib.c和soapServerLib.c文件
  • -c 产生纯C代码,否则是C++代码(与头文件有关)
  • -I 指定import路径(见上文)
  • -x 不要产生XML示例文件
  • -i 生成C++包装,客户端为xxxxProxy.h(.cpp),服务器端为xxxxService.h(.cpp)。

编译...
>fatal error C1083: Cannot open include file: 'stdsoap2.h': No such file or directory

缺少头文件,OK,需要将stdsoap2.h/stdsoap2.c 拷到工程目录下,并添加到工程中。

再编译...
>soapClientLib.obj : error LNK2005: _soap_call___ns2__HelloWorld already defined in soapClient.obj

查看生成的soapClientLib.c文件,发现如下代码:

#ifndef WITH_NOGLOBAL
#define WITH_NOGLOBAL
#endif
#define SOAP_FMAC3 static
#include "soapC.c"
#include "soapClient.c"

/* End of soapClientLib.c */

之前已经添加soapC.c,soapClient.c,可以去掉soapClientLib.c了。

再编译...
Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped

http://www.cnblogs.com/zhouhq/archive/2011/03/12/1982291.html

*编译可能产生问题 stdsoap2.obj : error LNK2001: 无法解析的外部符号 namespaces
处理:在工程中定义 WITH_NONAMESPACES 宏.
*最好不要添加多了文件文件,以免发生问题。
*这些文件的路径有新生成的win32下,有gsoap_2.8.1\gsoap-2.8\gsoap下。

抱歉!评论已关闭.