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

Re: Access violation podczas przekazywania parametrów dla WSDL

Nowy postNapisane: środa, 2 grudnia 2015, 13:13
przez polymorphism
Niby XE4 wspiera C++11, ale widać, że nie jest to pełne wsparcie (a jest już standard C++14! W 17 roku następny...). Z drugiej strony wystarczy przecież tak:
KOD cpp:     UKRYJ  
... = String(x);

VCL-owski String ma konstruktory konwertujące (między innymi wartości typu int).

Re: Access violation podczas przekazywania parametrów dla WSDL

Nowy postNapisane: środa, 2 grudnia 2015, 17:43
przez Cyfrowy Baron
mate006 napisał(a):Zrobiłem funkcję
KOD cpp:     UKRYJ  
String to_str(int i)
{
        string sText;
        ostringstream oStream;
        oStream << i;

        sText =  oStream.str();

        return sText.c_str();
}



U mnie działa - zwraca liczbę. Co dokładnie z tym robisz, że ci nie działa.

Re: Access violation podczas przekazywania parametrów dla WSDL

Nowy postNapisane: czwartek, 3 grudnia 2015, 11:36
przez mate006
KOD cpp:     UKRYJ  
String TForm1::ito_str(int *i)
{
        string sText;
        ostringstream oStream;
        oStream << i;

        sText =  oStream.str();

        return sText.c_str();
}


Przekazuję wskaźnik zal.jpg do funkcji i wyświetla adres zal2.jpg

Re: Access violation podczas przekazywania parametrów dla WSDL

Nowy postNapisane: czwartek, 3 grudnia 2015, 17:28
przez Cyfrowy Baron
Jaki wskaźnik?! Zastanów się co robisz. Jaką wartość obiekt przekazuje do funkcji? Czym jest to id? Co to za obiekt ten wynik? Sprawdziłeś bez przekazywania do funkcji jaką wartość zwraca id

Re: Access violation podczas przekazywania parametrów dla WSDL

Nowy postNapisane: piątek, 4 grudnia 2015, 16:54
przez mate006
Z konwersją sobie poradziłem metodą prób i błędów, jednak mam problem z przypisaniem wartości:

KOD cpp:     UKRYJ  
        ns1__requestType *request = new ns1__requestType;

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

        request->authenticate->system_USCOREkey = "Password";
        request->authenticate->system_USCORElogin = "Login";

        ns1__orderType *order = new ns1__orderType;
        order->order_USCOREstatus = "packed";

        request->params->orders = new ordersType;
        request->params->orders->__size = 1;
        request->params->orders->__ptr[0] = order;  <------- to jest błąd Access violation
 

KOD cpp:     UKRYJ  
class ns1__paramsType
{ public:
/// Element "orders" of XSD type "setOrders":ordersType.
    ordersType*                          orders                         0;      ///< Optional element.
/// A handle to the soap struct that manages this instance (automatically set).
    struct soap                         *soap                          ;
};

class ordersType
{ public:
/// Pointer to array of ns1__orderType*.
    ns1__orderType*                     *__ptr                         ;
/// Size of the dynamic array.
    int                                  __size                        ;
/// Offset for partially transmitted arrays (uncomment only when required).
//  int                                  __offset                      ;
/// A handle to the soap struct that manages this instance (automatically set).
    struct soap                         *soap                          ;
};

class ns1__orderType
{ public:
/// Element "order_id" of XSD type xs:string.
    char*                                order_USCOREid                 0;      ///< Optional element.
/// Element "order_sn" of XSD type xs:int.
    int*                                 order_USCOREsn                 0;      ///< Optional element.
/// Element "order_status" of XSD type xs:string.
    char*                                order_USCOREstatus             0;      ///< Optional element.
/// Element "api_flag" of XSD type "setOrders":apiFlagType.
    enum ns1__apiFlagType*               api_USCOREflag                 0;      ///< Optional element.
/// Element "api_note" of XSD type xs:string.
    char*                                api_USCOREnote                 0;      ///< Optional element.
/// Element "client_note" of XSD type xs:string.
    char*                                client_USCOREnote              0;      ///< Optional element.
/// Element "deliverer_note" of XSD type xs:string.
    char*                                deliverer_USCOREnote           0;      ///< Optional element.
/// Element "order_note" of XSD type xs:string.
    char*                                order_USCOREnote               0;      ///< Optional element.
/// Element "products" of XSD type "setOrders":productsType.
    productsType*                        products                       0;      ///< Optional element.
/// Element "payment_type" of XSD type "setOrders":paymentType.
    enum ns1__paymentType*               payment_USCOREtype             0;      ///< Optional element.
/// Element "ignore_bridge" of XSD type xs:boolean.
    bool*                                ignore_USCOREbridge            0;      ///< Optional element.
/// Element "currency_panel_rate" of XSD type xs:float.
    float*                               currency_USCOREpanel_USCORErate 0;     ///< Optional element.
/// A handle to the soap struct that manages this instance (automatically set).
    struct soap                         *soap                          ;
};
 

Re: Access violation podczas przekazywania parametrów dla WSDL

Nowy postNapisane: piątek, 4 grudnia 2015, 18:56
przez polymorphism
__ptr na nic konkretnego nie wskazuje.

Re: Access violation podczas przekazywania parametrów dla WSDL

Nowy postNapisane: poniedziałek, 7 grudnia 2015, 09:47
przez mate006
A zdradziłbyś jak wskazać ten obiekt?

jak daje
KOD cpp:     UKRYJ  
request->params->orders->__ptr[0] = *order;


To wyskakuje błąd podczas kompilowania.

Cannot convert 'ns1__orderType' to 'ns1__orderType *'



A jak zrobię
KOD cpp:     UKRYJ  
ns1__orderType* *order = new ns1__orderType*;


To dalej wyskakuje błąd Access violation

Re: Access violation podczas przekazywania parametrów dla WSDL

Nowy postNapisane: poniedziałek, 7 grudnia 2015, 10:53
przez polymorphism
Jak chcesz używać tablicy, to najpierw ją stwórz:
KOD cpp:     UKRYJ  
request->params->orders->__size = 1;
request->params->orders->__ptr = new ns1__orderType*[ request->params->orders->__size ];
request->params->orders->__ptr[0] = order;  


p.s. wydaje mi się, że już wcześniej miałeś podobny problem.

Re: Access violation podczas przekazywania parametrów dla WSDL

Nowy postNapisane: poniedziałek, 21 grudnia 2015, 14:50
przez mate006
Dzięki Ci polymorphism za nakierowanie, ruszyłem trochę z tematem, jednak stanąłem na tym że jak chce dodać kilka tablic
request->params->orders->__ptr[0] = order;
request->params->orders->__ptr[1] = order;

To tylko jedną tablice przekazuje, ale to na razie zostawiłem na bok.

Bo mam ważniejszą sprawę, nie mogę zmienić AnsiString na float *

AnsiString na char * zrobiłem za pomocą

KOD cpp:     UKRYJ  
code = strdup(kod.c_str());


A z tym floatem nic mi się nie udaje. Próbowałem atof(cena.c_str()); Jednak źle konwertowało

W załączniku widać to najlepiej

Re: Access violation podczas przekazywania parametrów dla WSDL

Nowy postNapisane: poniedziałek, 21 grudnia 2015, 19:58
przez polymorphism
Podejrzewam, że problemem jest przecinek - być może funkcja atof przy domyślnym locale za przecinek przyjmuje kropkę, a program podsyła jej liczbę z przecinkiem jako separatorem dziesiętnym.

Opcji jest kilka. Pierwsza to taka, żebyś do konwersji użył jakiejś funkcji VCL-owskiej (nie pamiętam, więc Ci nie powiem). Druga: trzeba przestawić locale na systemowe. Daj gdzieś na początku WinMain:
KOD cpp:     UKRYJ  
setlocale(LC_NUMERIC, ".ACP");

Opcja trzecia: zamienić separator na właściwy, zgodny z aktualnym locale:
KOD cpp:     UKRYJ  
float v;
std::string s = "3,14";
       
auto lc = localeconv();
       
for (auto &c : s)
{
        if (c == ',' || c == '.')
        {
                c = lc->decimal_point[0];
                break;
        }
}

v = atof(s.c_str());


Trzecia opcja to trochę przerost formy nad treścią...

Re: Access violation podczas przekazywania parametrów dla WSDL

Nowy postNapisane: piątek, 15 stycznia 2016, 11:06
przez mate006
Dzięki Ci polymorphism za nakierowanie, już wszystko ładnie działa, jednak mam inny poważny problem.

Na chwile obecną nie działam z API Allegro tylko innego serwisu w którym są oddzielne funkcje, np. getProducts i setProducts występują w dwóch oddzielnych adresach WSDL, które jednak mają takie same główne nazwy parametrów przekazywanych

getProducts
KOD cpp:     UKRYJ  
   ns1__requestType *request = new ns1__requestType;

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

setProducts
KOD cpp:     UKRYJ  
   ns1__requestType *request = new ns1__requestType;

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

   request->authenticate->system_USCOREkey = password;
   request->authenticate->system_USCORElogin = login;


I chciałbym spytać czy jest możliwość w jednej aplikacji umieszczenie kilku WSDL gSoap

Re: Access violation podczas przekazywania parametrów dla WSDL

Nowy postNapisane: piątek, 15 stycznia 2016, 12:12
przez polymorphism
Chodzi Ci o to, że oba API (serwisów internetowych) mają te same klasy i jest jakiś konflikt nazw?

Re: Access violation podczas przekazywania parametrów dla WSDL

Nowy postNapisane: piątek, 15 stycznia 2016, 14:35
przez mate006
Tak dokładnie, ten sam serwis oferuje jedynie każdą funkcję operacji osobno, i jest konflikt nazw.

Jedno pobiera dane drugie wysyła dane.

Re: Access violation podczas przekazywania parametrów dla WSDL

Nowy postNapisane: piątek, 15 stycznia 2016, 15:27
przez polymorphism
W C++, żeby rozwiązać tego typu problemy, wprowadzono przestrzenie nazw. Jeśli API tych serwisów nie znajdują się w oddzielnych przestrzeniach (a zakładam, że nie), to masz problem, chyba że przy generowaniu źródeł możesz włączyć dodanie przestrzeni nazw.

Zawsze możesz obsługę serwisów przenieść do oddzielnych DLL-ek ;)

PS. po szybkim przejrzeniu dokumentacji gSOAP widzę, że jest opcja wstawiania w przestrzeń nazw -> dla wsdl2h -qname

Re: Access violation podczas przekazywania parametrów dla WSDL

Nowy postNapisane: czwartek, 21 stycznia 2016, 14:18
przez mate006
Wygenerowałem pliki z przestrzenią nazw. Jednak podczas kompilowania pojawiają się błędy:


[ilink32 Error] Error: Unresolved external '_soap_faultcode' referenced from C:\MY PROGRAMS\TEST GSOAP\WIN32\DEBUG\STDSOAP2.OBJ
[ilink32 Error] Error: Unresolved external '_soap_faultsubcode' referenced from C:\MY PROGRAMS\TEST GSOAP\WIN32\DEBUG\STDSOAP2.OBJ
[ilink32 Error] Error: Unresolved external '_soap_faultstring' referenced from C:\MY PROGRAMS\TEST GSOAP\WIN32\DEBUG\STDSOAP2.OBJ
[ilink32 Error] Error: Unresolved external '_soap_faultdetail' referenced from C:\MY PROGRAMS\TEST GSOAP\WIN32\DEBUG\STDSOAP2.OBJ
[ilink32 Error] Error: Unresolved external '_soap_check_faultsubcode' referenced from C:\MY PROGRAMS\TEST GSOAP\WIN32\DEBUG\STDSOAP2.OBJ
[ilink32 Error] Error: Unresolved external '_soap_check_faultdetail' referenced from C:\MY PROGRAMS\TEST GSOAP\WIN32\DEBUG\STDSOAP2.OBJ
[ilink32 Error] Error: Unresolved external '_soap_serializeheader' referenced from C:\MY PROGRAMS\TEST GSOAP\WIN32\DEBUG\GETOGETORDERSBINDINGPROXY.OBJ
[ilink32 Error] Error: Unresolved external '_soap_putheader' referenced from C:\MY PROGRAMS\TEST GSOAP\WIN32\DEBUG\GETOGETORDERSBINDINGPROXY.OBJ
[ilink32 Error] Error: Unresolved external '_soap_getheader' referenced from C:\MY PROGRAMS\TEST GSOAP\WIN32\DEBUG\STDSOAP2.OBJ
[ilink32 Error] Error: Unresolved external '_soap_getfault' referenced from C:\MY PROGRAMS\TEST GSOAP\WIN32\DEBUG\STDSOAP2.OBJ
[ilink32 Error] Error: Unable to perform link