CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Access violation podczas przekazywania parametrów dla WSDL
Strona 5 z 6

Re: Access violation podczas przekazywania parametrów dla WSDL

Nowy postNapisane: czwartek, 21 stycznia 2016, 19:12
przez polymorphism
A implementacje metod także są w przestrzeniach nazw? Coś mi wygląda, że nie.

Re: Access violation podczas przekazywania parametrów dla WSDL

Nowy postNapisane: wtorek, 26 stycznia 2016, 09:41
przez mate006
Według mnie wszystko jest w przestrzeni nazw (pliki w załączniku)

A tak tworzę zmienne

KOD cpp:     UKRYJ  
getO::ordersSnType *sn = new getO::ordersSnType;

getO::ns1__requestType *request = new getO::ns1__requestType;

request->authenticate = new getO::ns1__authenticateType;
request->params = new getO::ns1__paramsType;

Re: Access violation podczas przekazywania parametrów dla WSDL

Nowy postNapisane: wtorek, 26 stycznia 2016, 13:30
przez polymorphism
Sam dodawałeś przestrzenie, czy użyłeś wspomnianej opcji przy generowaniu źródeł?

Z błędów linkera wynika, że w stdsoap2.cpp są odwołania do funkcji bez uwzględnienia przestrzeni nazw - trochę to dziwne. Każdy serwis powinien mieć swoją własną wersję pliku stdsoap2.cpp (pokombinuj z opcją -p).

Re: Access violation podczas przekazywania parametrów dla WSDL

Nowy postNapisane: wtorek, 26 stycznia 2016, 20:01
przez mate006
Generowałem tak jak mi poleciłeś przez "-q getO", w najbliższym czasie spróbuje coś podziałać

Re: Access violation podczas przekazywania parametrów dla WSDL

Nowy postNapisane: środa, 27 stycznia 2016, 21:02
przez polymorphism
Dobra, sprawdziłem u siebie opcję z przestrzeniami i powiem jedno: daj sobie z tym spokój. Ta opcja -q jest kompletnie zjebana (sorry za słowo, ale ono adekwatnie oddaje stan rzeczy).

Re: Access violation podczas przekazywania parametrów dla WSDL

Nowy postNapisane: czwartek, 28 stycznia 2016, 16:21
przez mate006
Dzięki za sprawdzenie, bo mi już ten gsoap zaczyna bokiem wychodzić :D. To co byś mi zaproponował

Re: Access violation podczas przekazywania parametrów dla WSDL

Nowy postNapisane: czwartek, 28 stycznia 2016, 19:15
przez polymorphism
Innym rozwiązaniem konfliktu nazw jest pisanie drugiego klienta w DLL-ce (idealnie by było, gdyby każdy klient był w oddzielnej DLL-ce, coby porządek w kodzie był).

Re: Access violation podczas przekazywania parametrów dla WSDL

Nowy postNapisane: poniedziałek, 8 lutego 2016, 17:00
przez mate006
Z tymi bibliotekami nawet sobie poradziłem, jednak mam jeszcze jeden problem, bo nie wiem jak połączyć się przez gsoap na protokole HTTPS

Re: Access violation podczas przekazywania parametrów dla WSDL

Nowy postNapisane: poniedziałek, 8 lutego 2016, 19:25
przez polymorphism
Zapewne wszystko masz opisane w dokumentacji. Tak na szybko: kompilacja z flagą WITH_OPENSSL, co wiąże się z dodaniem biblioteki OpenSSL do projektu.

Re: Access violation podczas przekazywania parametrów dla WSDL

Nowy postNapisane: środa, 17 lutego 2016, 18:40
przez mate006
Dzięki Ci polymorphism za pomoc, teraz to już jest ok.

Połączyłem się, pobiera dane, jednak nie działa wyświetlanie błędów, tzn. nie wiem jak je odczytać. Np. o nieprawidłowym logowaniu.

np.
http://allegro.pl/webapi/documentation.php/show/id,82#method-error-codes

W wynikach też ich nie ma, jak w innym serwisie z którego korzystałem.

Re: Access violation podczas przekazywania parametrów dla WSDL

Nowy postNapisane: czwartek, 18 lutego 2016, 11:34
przez polymorphism
Trochę nie rozumiem pytania. Przecież funkcje/metody zwracają kody błędów, więc w czym problem?

Re: Access violation podczas przekazywania parametrów dla WSDL

Nowy postNapisane: wtorek, 23 lutego 2016, 18:17
przez mate006
Dziwne rzeczy zaczęły się dziać. Jeszcze tydzień temu działało bez zarzutu. A mianowicie gdy pobieram wersje struktury drzewa

KOD cpp:     UKRYJ  
        try
        {
                serviceBindingProxy *wsdl = new serviceBindingProxy;

                _ns1__DoQueryAllSysStatusRequest *req = new _ns1__DoQueryAllSysStatusRequest;
                _ns1__doQueryAllSysStatusResponse *wynik = new _ns1__doQueryAllSysStatusResponse;

                req->countryId = 1;
                req->webapiKey = strdup(webapiKey.c_str());

                wsdl->doQueryAllSysStatus(req, *wynik);

                wynik->sysCountryStatus->item[0]->catsVersion;  //-- tutaj wyskakuje błąd Access Violation
        }
        catch (Exception &exception)
        {
                Application->ShowException(&exception);
        }
 


Zapewne nie pobiera danych, tylko dlaczego skoro wszystko działało poprawnie.

KOD cpp:     UKRYJ  
void serviceBindingProxy::serviceBindingProxy_init(soap_mode imode, soap_mode omode)
{       soap_imode(this->soap, imode);
        soap_omode(this->soap, omode);
        soap_endpoint = NULL;
        static const struct Namespace namespaces[] =
{
        {"SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/", "http://www.w3.org/*/soap-envelope", NULL},
        {"SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/", "http://www.w3.org/*/soap-encoding", NULL},
        {"xsi", "http://www.w3.org/2001/XMLSchema-instance", "http://www.w3.org/*/XMLSchema-instance", NULL},
        {"xsd", "http://www.w3.org/2001/XMLSchema", "http://www.w3.org/*/XMLSchema", NULL},
        {"ns1", "https://webapi.allegro.pl/service.php", NULL, NULL},
        {NULL, NULL, NULL, NULL}
};
        soap_set_namespaces(this->soap, namespaces);
}
 


KOD cpp:     UKRYJ  
int serviceBindingProxy::doQueryAllSysStatus(const char *endpoint, const char *soap_action, _ns1__DoQueryAllSysStatusRequest *ns1__DoQueryAllSysStatusRequest, _ns1__doQueryAllSysStatusResponse &ns1__doQueryAllSysStatusResponse)
{       struct soap *soap = this->soap;
        struct __ns1__doQueryAllSysStatus soap_tmp___ns1__doQueryAllSysStatus;
        if (endpoint)
                soap_endpoint = endpoint;
        if (soap_endpoint == NULL)
                soap_endpoint = "https://webapi.allegro.pl/service.php";
        if (soap_action == NULL)
                soap_action = "#doQueryAllSysStatus";
        soap_begin(soap);
        soap->encodingStyle = NULL;
        soap_tmp___ns1__doQueryAllSysStatus.ns1__DoQueryAllSysStatusRequest = ns1__DoQueryAllSysStatusRequest;
        soap_serializeheader(soap);
        soap_serialize___ns1__doQueryAllSysStatus(soap, &soap_tmp___ns1__doQueryAllSysStatus);
        if (soap_begin_count(soap))
                return soap->error;
        if (soap->mode & SOAP_IO_LENGTH)
        {       if (soap_envelope_begin_out(soap)
                 || soap_putheader(soap)
                 || soap_body_begin_out(soap)
                 || soap_put___ns1__doQueryAllSysStatus(soap, &soap_tmp___ns1__doQueryAllSysStatus, "-ns1:doQueryAllSysStatus", NULL)
                 || soap_body_end_out(soap)
                 || soap_envelope_end_out(soap))
                         return soap->error;
        }
        if (soap_end_count(soap))
                return soap->error;
        if (soap_connect(soap, soap_url(soap, soap_endpoint, NULL), soap_action)
         || soap_envelope_begin_out(soap)
         || soap_putheader(soap)
         || soap_body_begin_out(soap)
         || soap_put___ns1__doQueryAllSysStatus(soap, &soap_tmp___ns1__doQueryAllSysStatus, "-ns1:doQueryAllSysStatus", NULL)
         || soap_body_end_out(soap)
         || soap_envelope_end_out(soap)
         || soap_end_send(soap))
                return soap_closesock(soap);
        if (!&ns1__doQueryAllSysStatusResponse)
                return soap_closesock(soap);
        ns1__doQueryAllSysStatusResponse.soap_default(soap);
        if (soap_begin_recv(soap)
         || soap_envelope_begin_in(soap)
         || soap_recv_header(soap)
         || soap_body_begin_in(soap))
                return soap_closesock(soap);
        ns1__doQueryAllSysStatusResponse.soap_get(soap, "ns1:doQueryAllSysStatusResponse", NULL);
        if (soap->error)
                return soap_recv_fault(soap, 0);
        if (soap_body_end_in(soap)
         || soap_envelope_end_in(soap)
         || soap_end_recv(soap))
                return soap_closesock(soap);
        return soap_closesock(soap);
}
 


Co może być przyczyną

Re: Access violation podczas przekazywania parametrów dla WSDL

Nowy postNapisane: wtorek, 23 lutego 2016, 19:54
przez polymorphism
Z tabeli widać, że sysCountryStatus jest NULL, a Ty próbujesz czytać z tego:
KOD cpp:     UKRYJ  
 wynik->sysCountryStatus->item[0] ...

Zawsze powinieneś sprawdzać, jaki kod błędu zwraca funkcja. Spróbuj tak:
KOD cpp:     UKRYJ  
serviceBindingProxy *wsdl = new serviceBindingProxy;

_ns1__doQueryAllSysStatusResponse wynik;

int res = wsdl->doQueryAllSysStatus(1, webapiKey, wynik);

if(res == SOAP_OK)
{
        wynik.sysCountryStatus->item[0]->catsVersion;  
        ...
}
else
{
        // 'res' zawiera kod błędu.
        // zajrzyj do stdsoap2.h, masz tam zdefiniowane kody błędów SOAP_xxx, będziesz wiedział co jest problemem.
}

Re: Access violation podczas przekazywania parametrów dla WSDL

Nowy postNapisane: środa, 24 lutego 2016, 11:23
przez mate006
Zrobiłem jak zaproponowałeś, i wyszło że jest błąd:

SOAP_SSL_ERROR



Dodałem do pliku biblioteki:
openssl oraz #define WITH_OPENSSL

skompilowało poprawnie jednak nadal wyskakuje ten błąd

Re: Access violation podczas przekazywania parametrów dla WSDL

Nowy postNapisane: środa, 24 lutego 2016, 11:30
przez polymorphism
WITH_OPENSSL dodaj w opcjach projektu.