1 Gsoap 使用
下载gsoap (gsoap-2.8)(版本 for CE DVICE改进版)址(:http://sourceforge.net/projects/gsoap2/)
- 解压(E:\Development\cpp\gsoap-2.8)
- 打开“命令提示符”(开始-附件)(又没用过的东东......)
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
在_DEBUG下new被重定义了(用来检测内存泄漏),然后查了下自己的代码,发现也有new的新定义……,因为之前是从MFC下面迁移过来的代码:
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #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 生成的头文件里的变量、类型等名称的前面都会加上名空间前缀,以两个下划线分隔。如上面的命令生成的头文件,有这样的定 义:
- class ay1__ArrayOfString;
- enum ay1__theDayFlagEnum
- {
- ay1__theDayFlagEnum__Today,
- ay1__theDayFlagEnum__Tomorrow,
- ay1__theDayFlagEnum__theDayafterTomorrow,
- };
前面的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下。