【发布时间】:2011-08-11 02:16:34
【问题描述】:
这是一个空指针解引用问题 - 在 ANSI C 和 gSoap 域中:
我正在使用以下公共WSDL:
http://www.mobilefish.com/services/web_service/countries.php?wsdl
并使用soapUI测试了它的行为。
我使用 wsdl2h 和 soapcpp2 实用程序创建了仅客户端的 ANSI C 绑定。
问题:
在以前的 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 * 的结构的结构)在初始化时返回完全填充的结果,除了我上面显示的内容。
有什么想法吗?如果我能提供任何进一步的细节,请告诉我。 谢谢。
【问题讨论】: