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

Access violation podczas przekazywania parametrów dla WSDL

problemy z tworzeniem programów do obsługi sieci, internetu, e-mail itp..

Re: Access violation podczas przekazywania parametrów dla WSDL

Nowy postprzez polymorphism » środa, 2 grudnia 2015, 13:13

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).
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2187
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 204
System operacyjny: Windows 7 Pro
Windows 8.1
Linux Mint 19
Kompilator: Visual Studio 2015 Community
CodeLite (MinGW)
MSYS2 (MinGW, clang)
g++
Gadu Gadu: 0
    Windows 7Firefox

Re: Access violation podczas przekazywania parametrów dla WSDL

Nowy postprzez Cyfrowy Baron » środa, 2 grudnia 2015, 17:43

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.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4728
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 444
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

Re: Access violation podczas przekazywania parametrów dla WSDL

Nowy postprzez mate006 » czwartek, 3 grudnia 2015, 11:36

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
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
mate006
Intelektryk
Intelektryk
 
Posty: 143
Dołączył(a): wtorek, 2 marca 2010, 14:12
Podziękował : 7
Otrzymał podziękowań: 0
System operacyjny: Windows 7 Premium 64
Kompilator: Embarcadero® C++Builder® XE
Gadu Gadu: 0
    Windows 7Firefox

Re: Access violation podczas przekazywania parametrów dla WSDL

Nowy postprzez Cyfrowy Baron » czwartek, 3 grudnia 2015, 17:28

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
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4728
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 444
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

Re: Access violation podczas przekazywania parametrów dla WSDL

Nowy postprzez mate006 » piątek, 4 grudnia 2015, 16:54

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                          ;
};
 
Avatar użytkownika
mate006
Intelektryk
Intelektryk
 
Posty: 143
Dołączył(a): wtorek, 2 marca 2010, 14:12
Podziękował : 7
Otrzymał podziękowań: 0
System operacyjny: Windows 7 Premium 64
Kompilator: Embarcadero® C++Builder® XE
Gadu Gadu: 0
    Windows 7Firefox

Re: Access violation podczas przekazywania parametrów dla WSDL

Nowy postprzez polymorphism » piątek, 4 grudnia 2015, 18:56

__ptr na nic konkretnego nie wskazuje.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2187
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 204
System operacyjny: Windows 7 Pro
Windows 8.1
Linux Mint 19
Kompilator: Visual Studio 2015 Community
CodeLite (MinGW)
MSYS2 (MinGW, clang)
g++
Gadu Gadu: 0
    Windows 7Firefox

Re: Access violation podczas przekazywania parametrów dla WSDL

Nowy postprzez mate006 » poniedziałek, 7 grudnia 2015, 09:47

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
Avatar użytkownika
mate006
Intelektryk
Intelektryk
 
Posty: 143
Dołączył(a): wtorek, 2 marca 2010, 14:12
Podziękował : 7
Otrzymał podziękowań: 0
System operacyjny: Windows 7 Premium 64
Kompilator: Embarcadero® C++Builder® XE
Gadu Gadu: 0
    Windows 7Firefox

Re: Access violation podczas przekazywania parametrów dla WSDL

Nowy postprzez polymorphism » poniedziałek, 7 grudnia 2015, 10:53

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.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2187
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 204
System operacyjny: Windows 7 Pro
Windows 8.1
Linux Mint 19
Kompilator: Visual Studio 2015 Community
CodeLite (MinGW)
MSYS2 (MinGW, clang)
g++
Gadu Gadu: 0
    Windows 7Firefox

Re: Access violation podczas przekazywania parametrów dla WSDL

Nowy postprzez mate006 » poniedziałek, 21 grudnia 2015, 14:50

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
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
mate006
Intelektryk
Intelektryk
 
Posty: 143
Dołączył(a): wtorek, 2 marca 2010, 14:12
Podziękował : 7
Otrzymał podziękowań: 0
System operacyjny: Windows 7 Premium 64
Kompilator: Embarcadero® C++Builder® XE
Gadu Gadu: 0
    Windows 7Firefox

Re: Access violation podczas przekazywania parametrów dla WSDL

Nowy postprzez polymorphism » poniedziałek, 21 grudnia 2015, 19:58

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ą...
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2187
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 204
System operacyjny: Windows 7 Pro
Windows 8.1
Linux Mint 19
Kompilator: Visual Studio 2015 Community
CodeLite (MinGW)
MSYS2 (MinGW, clang)
g++
Gadu Gadu: 0
    Windows 7Firefox

Re: Access violation podczas przekazywania parametrów dla WSDL

Nowy postprzez mate006 » piątek, 15 stycznia 2016, 11:06

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
Avatar użytkownika
mate006
Intelektryk
Intelektryk
 
Posty: 143
Dołączył(a): wtorek, 2 marca 2010, 14:12
Podziękował : 7
Otrzymał podziękowań: 0
System operacyjny: Windows 7 Premium 64
Kompilator: Embarcadero® C++Builder® XE
Gadu Gadu: 0
    Windows 7Firefox

Re: Access violation podczas przekazywania parametrów dla WSDL

Nowy postprzez polymorphism » piątek, 15 stycznia 2016, 12:12

Chodzi Ci o to, że oba API (serwisów internetowych) mają te same klasy i jest jakiś konflikt nazw?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2187
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 204
System operacyjny: Windows 7 Pro
Windows 8.1
Linux Mint 19
Kompilator: Visual Studio 2015 Community
CodeLite (MinGW)
MSYS2 (MinGW, clang)
g++
Gadu Gadu: 0
    Windows 7Firefox

Re: Access violation podczas przekazywania parametrów dla WSDL

Nowy postprzez mate006 » piątek, 15 stycznia 2016, 14:35

Tak dokładnie, ten sam serwis oferuje jedynie każdą funkcję operacji osobno, i jest konflikt nazw.

Jedno pobiera dane drugie wysyła dane.
Avatar użytkownika
mate006
Intelektryk
Intelektryk
 
Posty: 143
Dołączył(a): wtorek, 2 marca 2010, 14:12
Podziękował : 7
Otrzymał podziękowań: 0
System operacyjny: Windows 7 Premium 64
Kompilator: Embarcadero® C++Builder® XE
Gadu Gadu: 0
    Windows 7Firefox

Re: Access violation podczas przekazywania parametrów dla WSDL

Nowy postprzez polymorphism » piątek, 15 stycznia 2016, 15:27

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
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2187
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 204
System operacyjny: Windows 7 Pro
Windows 8.1
Linux Mint 19
Kompilator: Visual Studio 2015 Community
CodeLite (MinGW)
MSYS2 (MinGW, clang)
g++
Gadu Gadu: 0
    Windows 7Firefox

Re: Access violation podczas przekazywania parametrów dla WSDL

Nowy postprzez mate006 » czwartek, 21 stycznia 2016, 14:18

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

Avatar użytkownika
mate006
Intelektryk
Intelektryk
 
Posty: 143
Dołączył(a): wtorek, 2 marca 2010, 14:12
Podziękował : 7
Otrzymał podziękowań: 0
System operacyjny: Windows 7 Premium 64
Kompilator: Embarcadero® C++Builder® XE
Gadu Gadu: 0
    WindowsFirefox

Poprzednia stronaNastępna strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Aplikacje sieciowe

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 3 gości

cron