这是一个 * 取消引用空指针 * 的问题-在ANSI C和gSoap域中:
我正在使用以下公共WSDL:
http://www.mobilefish.com/services/web_service/countries.php?wsdl
并使用soapUI测试了它的行为。
我使用wsdl 2 h和soapcpp 2实用程序创建了仅限客户端的ANSIC绑定。
- 问题:*
在以前的gsoap项目中,客户端soap_call函数(第五个参数)中的结果结构不需要初始化,只需要如下内容:
struct ns2__countryInfoByIanaResponse out, *pOut
pOut= &out;
在这个项目之前,这一直是足够的。
客户端soap_call如下所示:
soap_call_ns2__countryInfoByIana(&soap, NULL, NULL, pIn, pOut); /* SOAP 1.2 RPC return element...*/
此项目的pIn
定义为char *
,填充有两个字符的IANA代码,例如“us”或“nz”。此特定调用的返回结构pOut
如下所示:
struct ns2__countryInfoByIanaResponse
{
struct ns1__CountryData *countryinfo;
}
ns1__CountryData
的形状如下:
struct ns1__CountryData
{
char *ianacode; /* required element of type xsd:string */
char *countryname; /* required element of type xsd:string */
float latitude; /* required element of type xsd:float */
float longitude; /* required element of type xsd:float */
};
因此,从我的应用程序调用这个函数是这样设置的:
//declare response structure:
struct ns2__countryInfoByIanaResponse o, *pO;
void main(void)
{
pO = &o;
if(GetCountryInfo(buf, pO)==0)
{
pO->countryinfo->countryname; //Error Occurs Here...
}
}
错误发生在pO->countryinfo
上,是一个 * 空指针的解引用 *
GetCountryInfo定义如下:
int DLL_EXPORT GetCountryInfo(char *pIn, struct ns2__countryInfoByIanaResponse *pOut)
{
int status = 0;
size_t len=2048;
char buf[2048];
if (soap_call_ns2__countryInfoByIana(&soap, NULL, NULL, pIn, pOut)== SOAP_OK)
{
status = 0;
}
else
{
//soap_print_fault(&soap, stderr);
soap_sprint_fault(&soap, buf, len);
MessagePopup("soap error", buf);
status = 1;
}
return status;
}
其他使用类似输出结构形状的gSoap
项目(即包含char * 结构的结构)在初始化时返回完全填充的结果,除了我上面显示的之外。
有什么想法吗?如果我能提供任何进一步的细节,请让我知道。谢谢。
1条答案
按热度按时间jqjz2hbq1#
在我看来,soap服务器有一个bug。countryInfoByIana函数的soap响应示例如下所示:
<SOAP-ENV:countryInfoByIanaResponse>
应该有不同的命名空间。下面是WSDL的一部分,它包含相同的(无效的)名称空间。
编辑:
关于你的问题为什么soapUI工作得很好;soapUI可能不会像gsoap那样验证返回值。
我使用gsoap2.7成功地让程序在我的pc上运行:
在soapClient. c第56行中,更改此行:
在soapC. c第1470行中,更改此行:
但我认为你不应该这样解决问题。不仅因为两个文件都是生成的,所以当你再次生成它时,你会丢失你的更改。