64,654
社区成员
发帖
与我相关
我的任务
分享
std::vector<ns4__CodeInfo *> detectFace(uint8_t *pImgData,size_t nSize) {
soap soap;
//soap_register_plugin(&soap, plugin);
_ns1__sdk_USCOREdetectFace param;
_ns1__sdk_USCOREdetectFaceResponse ret;
xsd__base64Binary b;
b.soap = &soap;
b.__ptr = pImgData;
b.__size = (int)nSize;
// 设置调用参数
param.imgData = &b;
// 调用gosap生成代码实现Webservice调用
soap_call___ns1__sdk_USCOREdetectFace(&soap, soap_endpoint, NULL, ¶m, ret);
// 判断调用是否成功,如果不为SOAP_OK则进行错误处理,成功则返回结果(数组)
if (soap.error != SOAP_OK) {
soap_fault(&soap);
SOAP_ENV__Detail* detail = getFaultDetail(soap);
if (detail) {
if (detail->ns1__FaceDbServiceDeleteImgFail) {
std::cout << "FaceDbServiceDeleteImgFail:" << *soap_faultdetail(&soap) << std::endl;
}
else if (detail->ns1__FaceDbServiceDuplicateReord) {
std::cout << *detail->ns1__FaceDbServiceDuplicateReord->DuplicateReord->message << std::endl;
}
else if (detail->ns1__FaceDbServiceImageError) {
std::cout << "FaceDbServiceImageError:" << *soap_faultdetail(&soap) << std::endl;
}
else if (detail->ns1__FaceDbServiceNotFaceDetected) {
std::cout << "FaceDbServiceNotFaceDetected:" << *soap_faultdetail(&soap) << std::endl;
}
else if (detail->ns1__FaceDbServiceNotFoundBean) {
std::cout << "FaceDbServiceNotFoundBean:" << *soap_faultdetail(&soap) << std::endl;
}
else if (detail->ns1__FaceDbServiceServiceRuntime) {
std::cout << *detail->ns1__FaceDbServiceServiceRuntime->ServiceRuntime->serverStackTraceMessage << std::endl;
}
else {
const char* ptr = *soap_faultdetail(&soap);
if (ptr)
std::cout << ptr << std::endl;
ptr = *soap_faultstring(&soap);
if (ptr)
std::cout << ptr << std::endl;
}
}
}
// 返回结果
return ret.return_;
}
楼主的gsoap是生成的c接口吧?[/quote]
对,就是的,在这里卡了有很长时间,我把所有能想到的变量列出来监视,仍然无果[/quote]
不知道你gsoap生成代码的方式是怎样的
但是我生成的gsoap代码的返回对象xxxxRespone中_return就是解析好的返回值,没有再需要自己解析xml的工作[/quote]
我用的是网上查的,在cmd里用wsdl2h -o test.h +wsdl地址,生成头文件的这种方法,有的返回值定义的是string的,我用cout<<*Response.result来显示返回值是成功的,但这个返回值类型是我前面发的那样,它的类型是一个类名定义的,而这个类又定义了两个char *的参数。你是用的哪种方法呢[/quote]
下面是我生成gsoap C/C++代码的完整批处理脚本供你参考.
gsoapgen.bat
ECHO OFF
SETLOCAL
REM bat所在路径(%~dp0)为工作路径
SET work_dir=%~dp0
PUSHD %work_dir%
REM 定义gsoap根路径
SET GSOAP_HOME=gsoap-2.8
REM 将gsoap编译器加入搜索路径
SET PATH=%GSOAP_HOME%\gsoap\bin\win32;%PATH%
REM 定义wsdl文件位置
SET wsdl=..\webservice\build\wsdl\FaceDbService.wsdl
IF NOT EXIST %wsdl% (
REM wsdl文件不存在则报错退出
ECHO NOT FOUND %wsdl%
POPD
EXIT /B 1
)
REM 第一个命令行参数为-c时生成纯C代码,默认生成C++代码
REM %output% 指定输出路径
REM %suffix% c/c++代码文件后缀
IF "%1" == "-c" (
SET lanaguage=-c
SET output=gsoap_c\
SET suffix=.c
) ELSE (
SET lanaguage=-c++
SET output=gsoap\
SET suffix=.cpp
)
REM -t 指定自定义类型映射文件(因为我对Data日期类型有特殊处理所以需要个性默认的类型定义映射)
REM -o 指定输出文件夹
REM %lanaguage%指定生成的代码类型(c/c++)
wsdl2h %lanaguage% -t mytypemap.dat -o %output%facedbservice.h %wsdl%
REM %lanaguage%指定生成的代码类型(c/c++)
REM -d 指定输出文件输出路径
REM -C 只生成Client端代码
REM -L 不生成soapClientLib/soapServerLib代码
REM -x 不生成xml示例消息文件
REM -I 指定import路径
soapcpp2 %lanaguage% -d %output% -C -L -x -pfacedbservice -I%GSOAP_HOME%\gsoap\import;%GSOAP_HOME%\gsoap %output%facedbservice.h
REM 将stdsoap2.h和stdsoap2.cpp/c也一并复制到输出文件夹
copy %GSOAP_HOME%\gsoap\stdsoap2.h %output%
copy %GSOAP_HOME%\gsoap\stdsoap2%suffix% %output%
POPD
ENDLOCAL
[/quote]
嗯嗯,很感谢你,我今天再摸索摸索,我就是用gsoap生成的,我看了你的博客,我们方法大体差不多,中间有一些是差不多的std::vector<ns4__CodeInfo *> detectFace(uint8_t *pImgData,size_t nSize) {
soap soap;
//soap_register_plugin(&soap, plugin);
_ns1__sdk_USCOREdetectFace param;
_ns1__sdk_USCOREdetectFaceResponse ret;
xsd__base64Binary b;
b.soap = &soap;
b.__ptr = pImgData;
b.__size = (int)nSize;
// 设置调用参数
param.imgData = &b;
// 调用gosap生成代码实现Webservice调用
soap_call___ns1__sdk_USCOREdetectFace(&soap, soap_endpoint, NULL, ¶m, ret);
// 判断调用是否成功,如果不为SOAP_OK则进行错误处理,成功则返回结果(数组)
if (soap.error != SOAP_OK) {
soap_fault(&soap);
SOAP_ENV__Detail* detail = getFaultDetail(soap);
if (detail) {
if (detail->ns1__FaceDbServiceDeleteImgFail) {
std::cout << "FaceDbServiceDeleteImgFail:" << *soap_faultdetail(&soap) << std::endl;
}
else if (detail->ns1__FaceDbServiceDuplicateReord) {
std::cout << *detail->ns1__FaceDbServiceDuplicateReord->DuplicateReord->message << std::endl;
}
else if (detail->ns1__FaceDbServiceImageError) {
std::cout << "FaceDbServiceImageError:" << *soap_faultdetail(&soap) << std::endl;
}
else if (detail->ns1__FaceDbServiceNotFaceDetected) {
std::cout << "FaceDbServiceNotFaceDetected:" << *soap_faultdetail(&soap) << std::endl;
}
else if (detail->ns1__FaceDbServiceNotFoundBean) {
std::cout << "FaceDbServiceNotFoundBean:" << *soap_faultdetail(&soap) << std::endl;
}
else if (detail->ns1__FaceDbServiceServiceRuntime) {
std::cout << *detail->ns1__FaceDbServiceServiceRuntime->ServiceRuntime->serverStackTraceMessage << std::endl;
}
else {
const char* ptr = *soap_faultdetail(&soap);
if (ptr)
std::cout << ptr << std::endl;
ptr = *soap_faultstring(&soap);
if (ptr)
std::cout << ptr << std::endl;
}
}
}
// 返回结果
return ret.return_;
}
楼主的gsoap是生成的c接口吧?[/quote]
对,就是的,在这里卡了有很长时间,我把所有能想到的变量列出来监视,仍然无果[/quote]
不知道你gsoap生成代码的方式是怎样的
但是我生成的gsoap代码的返回对象xxxxRespone中_return就是解析好的返回值,没有再需要自己解析xml的工作[/quote]
我用的是网上查的,在cmd里用wsdl2h -o test.h +wsdl地址,生成头文件的这种方法,有的返回值定义的是string的,我用cout<<*Response.result来显示返回值是成功的,但这个返回值类型是我前面发的那样,它的类型是一个类名定义的,而这个类又定义了两个char *的参数。你是用的哪种方法呢[/quote]
下面是我生成gsoap C/C++代码的完整批处理脚本供你参考.
gsoapgen.bat
ECHO OFF
SETLOCAL
REM bat所在路径(%~dp0)为工作路径
SET work_dir=%~dp0
PUSHD %work_dir%
REM 定义gsoap根路径
SET GSOAP_HOME=gsoap-2.8
REM 将gsoap编译器加入搜索路径
SET PATH=%GSOAP_HOME%\gsoap\bin\win32;%PATH%
REM 定义wsdl文件位置
SET wsdl=..\webservice\build\wsdl\FaceDbService.wsdl
IF NOT EXIST %wsdl% (
REM wsdl文件不存在则报错退出
ECHO NOT FOUND %wsdl%
POPD
EXIT /B 1
)
REM 第一个命令行参数为-c时生成纯C代码,默认生成C++代码
REM %output% 指定输出路径
REM %suffix% c/c++代码文件后缀
IF "%1" == "-c" (
SET lanaguage=-c
SET output=gsoap_c\
SET suffix=.c
) ELSE (
SET lanaguage=-c++
SET output=gsoap\
SET suffix=.cpp
)
REM -t 指定自定义类型映射文件(因为我对Data日期类型有特殊处理所以需要个性默认的类型定义映射)
REM -o 指定输出文件夹
REM %lanaguage%指定生成的代码类型(c/c++)
wsdl2h %lanaguage% -t mytypemap.dat -o %output%facedbservice.h %wsdl%
REM %lanaguage%指定生成的代码类型(c/c++)
REM -d 指定输出文件输出路径
REM -C 只生成Client端代码
REM -L 不生成soapClientLib/soapServerLib代码
REM -x 不生成xml示例消息文件
REM -I 指定import路径
soapcpp2 %lanaguage% -d %output% -C -L -x -pfacedbservice -I%GSOAP_HOME%\gsoap\import;%GSOAP_HOME%\gsoap %output%facedbservice.h
REM 将stdsoap2.h和stdsoap2.cpp/c也一并复制到输出文件夹
copy %GSOAP_HOME%\gsoap\stdsoap2.h %output%
copy %GSOAP_HOME%\gsoap\stdsoap2%suffix% %output%
POPD
ENDLOCAL