本文在原创上面稍作修改
- Java端创建服务
- 输入网址,生成wsdl文件
- 使用wsdl2.exe生成头文件
注意:
如果说传输的内容中含有中文,则需要增加一个bat文件,把传输类型由std::string转为wchar_t*,由宽字符传输,则可以解决乱码问题.刚开始由于没有添加处理文件导致后续接收到的中文乱码,折腾了半天,希望大家少走弯路.
bat文件(用txt文本保存如下文件,再修改后缀为bat即可)中一句话:
xsd__string = | std::wstring | wchar_t*
- 根据wsdl文件生成头文件
先将目录切换到指定目录,为后续生成C++相关文件做准备
然后输入命令
命令执行后,会生成头文件
- 根据wsdl的网址生成头文件
- 中文乱码添加bat
- 根据soapcpp2.exe生成系列文件
soapcpp2常用选项
-C 仅生成客户端代码
-S 仅生成服务器端代码
-L 不要产生soapClientLib.c和soapServerLib.c文件
-c 产生纯C代码,否则是C++代码(与头文件有关)
-I 指定import路径
-x 不要产生XML示例文件
-i 生成C++包装,客户端为xxxxProxy.h(.cpp),服务器端为xxxxService.h(.cpp)
原始目录:
执行命令(注意大小写):
生成相关文件
- 程序执行
创建项目
添加文件,红色的文件复制到你创建项目目录下
你的项目添加效果如下:
代码如下:
#include "stdafx.h"
#include "soapH.h"
#include "PLMWebserviceImpServiceSoapBinding.nsmap"
using namespace std;
wchar_t * char2wchar(const char* cchar);
char * wchar2char(const wchar_t* wchar );
int _tmain(int argc, _TCHAR* argv[])
{
// SOAP的客户端
soap m_oSoap;
class ns1__sayHello sayhello;
class ns1__sayHelloResponse sayhelloReponse;
soap_init(&m_oSoap);
string a = "asds";
wchar_t *wstrName = char2wchar(a.c_str());
sayhello.arg0 = wstrName;
//int result = soap_call___ns1__sayHello(&m_oSoap,NULL,NULL,&sayhello,sayhelloReponse);
int result = soap_call___ns1__sayHello(&m_oSoap,"http://localhost:8080/CXFTest/services/PLMService",NULL,&sayhello,sayhelloReponse);
if(SOAP_OK == result)
{
// 输出返回结果
wchar_t* strResult = sayhelloReponse.return_;
//wcout.imbue(locale("chs"));
char *result_s = wchar2char(strResult);
cout<<"wcout:"<<result_s<<endl;
delete result_s;
}
delete wstrName;
/// 关闭SOAP
soap_destroy(&m_oSoap);
soap_end(&m_oSoap);
soap_done(&m_oSoap);
return 0;
}
wchar_t * char2wchar(const char* cchar)
{
wchar_t *m_wchar;
int len = MultiByteToWideChar( CP_ACP ,0,cchar ,strlen( cchar), NULL,0);
m_wchar= new wchar_t[len+1];
MultiByteToWideChar( CP_ACP ,0,cchar,strlen( cchar),m_wchar,len);
m_wchar[len]= '\0' ;
return m_wchar;
}
char * wchar2char(const wchar_t* wchar )
{
char * m_char;
int len= WideCharToMultiByte( CP_ACP ,0,wchar ,wcslen( wchar ), NULL,0, NULL ,NULL );
m_char= new char[len+1];
WideCharToMultiByte( CP_ACP ,0,wchar ,wcslen( wchar ),m_char,len, NULL ,NULL );
m_char[len]= '\0';
return m_char;
}
调用效果: