Это разыменование нулевого указателя проблема - в обоих ANSI C & gSoap доменах:
Я использую следующий публичный WSDL:
http://www.mobilefish.com/services/web_service/countries.php?wsdl
и проверили его поведение с помощью soapUI.
Я создал только привязки ANSI C на стороне клиента с помощью утилит wsdl2h и soapcpp2.
Моя проблема:
В предыдущих проектах 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 для этого проекта определяется как символ *, заполненный двухсимвольным кодом 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;
}
Итак, это, кажется, комбинация ANSI C / gSoap вопрос: другие проекты в прошлом, с очень похожими формами выходной структуры (т.е. структуры, содержащие структуры, содержащие char *) возвращает полностью заполненные результаты, когда инициализируется только с тем, что я показал выше.
Есть идеи? Пожалуйста, дайте мне знать, если я могу предоставить более подробную информацию.
Спасибо.