CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Logowanie przez IdHTTP

Logowanie przez IdHTTP

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

Re: Logowanie przez IdHTTP

Nowy postprzez duf » czwartek, 18 lutego 2010, 13:19

Poszło. Zapisany plik z rozszerzeniem .htm jest otwierany przez przeglądarkę. Chciałem bezpośrednio władować ten plik do kontrolki TCppWebBrowser ale mam accass violation:

Kod: Zaznacz cały
TMemoryStream *stm = new TMemoryStream();
Memo1->Lines->SaveToStream(stm);
IPersistStreamInit *psi;
stm->Seek(0,0);
TStreamAdapter *sa = new TStreamAdapter( stm, soReference );
if (SUCCEEDED(CppWebBrowser1->Document->QueryInterface(IID_IPersistStreamInit,(void **)&psi)))
psi->Load(*sa);
delete stm;
Avatar użytkownika
duf
Intelektryk
Intelektryk
 
Posty: 175
Dołączył(a): czwartek, 9 października 2008, 13:02
Podziękował : 17
Otrzymał podziękowań: 2
System operacyjny: Windows 10
Kompilator: XE8
Gadu Gadu: 0
    Windows XPFirefox

Re: Logowanie przez IdHTTP

Nowy postprzez polymorphism » czwartek, 18 lutego 2010, 13:19

To link do pliku na serwerze nasza-klasa, nie może być załadowany razem ze stroną wczytana z dysku twardego, gdyż stanowi element jakiegoś mechanizmu PHP.

A dlaczego nie może być, przecież url jest absolutny? Zresztą to plik CSS, plik styli, więc nie jest on aż tak istotny, jeśli wygląd strony nie jest ważny.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Logowanie przez IdHTTP

Nowy postprzez duf » czwartek, 18 lutego 2010, 13:25

Po zmianie rozszerzenia plik rozpoznawany jest przez przeglądarkę i otwiera się bez problemu. Ale ja chciałem otworzyć stronę bezpośrednio w kontrolce WebBrowser ale wywala mi access violation:

Kod: Zaznacz cały
TMemoryStream *stm = new TMemoryStream();
Memo1->Lines->SaveToStream(stm);
IPersistStreamInit *psi;
stm->Seek(0,0);
TStreamAdapter *sa = new TStreamAdapter( stm, soReference );
if (SUCCEEDED(CppWebBrowser1->Document->QueryInterface(IID_IPersistStreamInit,(void **)&psi)))
   psi->Load(*sa);
delete stm;


EDIT:
Coś mam problemy z wysyłaniem postów.
Avatar użytkownika
duf
Intelektryk
Intelektryk
 
Posty: 175
Dołączył(a): czwartek, 9 października 2008, 13:02
Podziękował : 17
Otrzymał podziękowań: 2
System operacyjny: Windows 10
Kompilator: XE8
Gadu Gadu: 0
    Windows XPFirefox

Re: Logowanie przez IdHTTP

Nowy postprzez polymorphism » czwartek, 18 lutego 2010, 13:32

A nie tak przypadkiem?
Kod: Zaznacz cały
(...)

TStreamAdapter *sa = new TStreamAdapter(stm,soOwned); //<--- niech adapter usunie 'stm'

if (SUCCEEDED(CppWebBrowser1->Document->QueryInterface(IID_IPersistStreamInit,(void **)&psi)))
{
   psi->Load(sa);
   psi->Release(); //<--- o tym zapomniałeś
}
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Logowanie przez IdHTTP

Nowy postprzez Cyfrowy Baron » czwartek, 18 lutego 2010, 13:40

A czytałeś poradę w serwisie Cyfrowy Baron, przecież wyraźnie tam napisałem, że przed załadowaniem czegokolwiek z pamięci do tej konotrolki, trzeba najpierw wczytać do niej pustą stronę, czyli powinno być tak:

Kod: Zaznacz cały
   CppWebBrowser1->Navigate(WideString("about:blank")); // wypełnienie kontrolki pustą stroną.

  TMemoryStream *stm = new TMemoryStream();
  Memo1->Lines->SaveToStream(stm);
  IPersistStreamInit *psi;
  stm->Seek(0,0);
  TStreamAdapter *sa = new TStreamAdapter( stm, soReference );
  if(SUCCEEDED(CppWebBrowser1->Document->QueryInterface(IID_IPersistStreamInit,(void **)&psi)))
     psi->Load(*sa);
  delete stm;


Najlepiej jest załadować pustą stronę do tej kontrolki tuż po uruchomieniu aplikacji, czyli np. w zdarzeniu OnCreate lub nawet w konstruktorze klasy formularza głównego aplikacji.



A dlaczego nie może być, przecież url jest absolutny? Zresztą to plik CSS, plik styli, więc nie jest on aż tak istotny, jeśli wygląd strony nie jest ważny.


Rzeczywiście, popełniłem błąd wklejając do przeglądarki adres, gdyż zamiast zacząć od http://... ja wkleiłem href="http://...
Strona zresztą jest ładowana prawidłowo z dysku, a style też są ładowane, oczywiście pod warunkiem, że aktywne jest połączenie z siecią.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Logowanie przez IdHTTP

Nowy postprzez duf » czwartek, 18 lutego 2010, 14:27

Cóż, można by napisać, że problem został rozwiązany. Na przykładzie naszej klasy całość działa imponująco. Szkoda tylko, że są to jednostkowe przypadki takich stron. Dziękuję.
Avatar użytkownika
duf
Intelektryk
Intelektryk
 
Posty: 175
Dołączył(a): czwartek, 9 października 2008, 13:02
Podziękował : 17
Otrzymał podziękowań: 2
System operacyjny: Windows 10
Kompilator: XE8
Gadu Gadu: 0
    Windows XPFirefox

Re: Logowanie przez IdHTTP

Nowy postprzez mckri » poniedziałek, 16 maja 2011, 20:32

@duf, czy możesz podać przykład logowania się do strony www opartej o php?
Z góry bardzo dziekuję.
Avatar użytkownika
mckri
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): piątek, 15 sierpnia 2008, 13:48
Podziękował : 10
Otrzymał podziękowań: 2
System operacyjny: Windows Vista SP2
Kompilator: BCB 5/2007/2009
    Windows VistaOpera

Re: Logowanie przez IdHTTP

Nowy postprzez Darek_C++ » poniedziałek, 16 maja 2011, 21:27

Jeśli chcesz się zalogować musisz:
Wysłać przeważnie metodą POST dane takie jak login i hasło ewentualnie dodatkowe pola ukryte lub kod tokena antyspamowego na adres skryptu php podanego w formularzu logowania w polu "action"
<form method="" action="">
I implementować obsługe cookie jakie wystawi serwer po prawidłowym zalogowaniu.

Całość "logowania" możesz zrealizować za pomocą pakietu Indy - TIdHTTP dostępnego w BCB.
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: Logowanie przez IdHTTP

Nowy postprzez mckri » wtorek, 17 maja 2011, 11:07

To może inaczej. Czy zna ktoś sposób na wywołanie nacisnięcia przycisku na stronie wczytanej do CppWebBrowser?
Obecnie mam w programie kontrolkę CppWebBrowser do której mam wczytana stronę. W polach na tej stronie uzupełniam login i hasło. Wystarczy tylko kliknąć na przycisk logowania. Tylko jak to zrobić?
Avatar użytkownika
mckri
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): piątek, 15 sierpnia 2008, 13:48
Podziękował : 10
Otrzymał podziękowań: 2
System operacyjny: Windows Vista SP2
Kompilator: BCB 5/2007/2009
    Windows VistaOpera

Re: Logowanie przez IdHTTP

Nowy postprzez Cyfrowy Baron » wtorek, 17 maja 2011, 11:33

Nie da się tego zrobić, gdyż ten przycisk nie jest elementem interfejsu API, lecz tylko elementem skryptu. Można co prawda symulować wciśnięcie klawisza myszy, ale to wymagałoby przesunięcia wskaźnika na ten przycisk. Metoda mało skuteczna.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Logowanie przez IdHTTP

Nowy postprzez polymorphism » wtorek, 17 maja 2011, 12:04

Jeśli ładujesz to do kontrolki IE, dostęp do poszczególnych elementów strony masz poprzez obiekty DOM. Z poziomu C++ realizowane jest to w sposób praktycznie identyczny jak OLE automation, czyli poprzez interfejs IDispatch. Poszukaj sobie w sieci jakiejś klasy-wrappera na ten interfejs, bo podejrzewam, że jego użycie może być dla Ciebie zbyt skomplikowane. Oczywiście odsyłam także do opisu architektury DOM, żeby wiedzieć co i jak.

Dostęp do instancji interfejsu IDispatch masz poprzez właściwość TCppWebBrowser::Document.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Logowanie przez IdHTTP

Nowy postprzez Cyfrowy Baron » środa, 18 maja 2011, 09:59

To o czym pisze polimorphism, to nie jest dokładnie kliknięcie na przycisk, ale efekt będzie taki sam. To jest raczej równoznaczne, z wciśnięciem klawisza ENTER na klawiaturze.
Można to zrobić w ten sposób:

KOD cpp:     UKRYJ  
IOleInPlaceActiveObject* pIOIPAO;
   HRESULT hr = WebBrowser1->Document->QueryInterface(
                              IID_IOleInPlaceActiveObject, (void**)&pIOIPAO);

   if(SUCCEEDED(hr))
   {
    pIOIPAO->TranslateAccelerator(&Msg);
    pIOIPAO->Release();
   }


To wymaga niestety ustawienia w opcjach internetowych przeglądarki obsługi czegoś tam. Nigdy nie udało mi się ustalić dokładnie czego, ale jeżeli to nie działa to musisz coś pozmieniać właśnie w Opcjach internetowych, na zakładce Zaawansowane, aż zacznie działać. U mnie działa. Nie wiem jednak jak to się ma do przeglądarki Internet Explorer 9.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Logowanie przez IdHTTP

Nowy postprzez mckri » środa, 18 maja 2011, 13:50

Podam może co znalazłem...
Do wcześniej wczytanej strony (http://www.programowanie.cal.pl/forum/ucp.php?mode=login)w kontrolce CppWebBrowser wykonuję poniższy kod:

KOD cpp:     UKRYJ  
IHTMLDocument2 *HTMLDoc = NULL;
//LONG ilFramesCount = 0;
if(SUCCEEDED(CppWebBrowser1->Document->QueryInterface(IID_IHTMLDocument2,
  (LPVOID*)&HTMLDoc)))
{
  IHTMLElementCollection *pAll = NULL;
  if(SUCCEEDED(HTMLDoc->get_all(&pAll)))
  {

        long len=0;
        pAll->get_length(&len);

        for(int i=0;i<len; i++)
        {

                IDispatch *pDisp = NULL;
                if(SUCCEEDED(pAll->item( (TVariant)i, (TVariant)i, &pDisp)))
                {
                  if(pDisp)
                  {
                        IHTMLInputElement *pInput = NULL;     // mshtml.h
                        pDisp->QueryInterface(IID_IHTMLInputElement, (LPVOID*)&pInput);

                        if(pInput)
                        {
                                wchar_t * nazwa;
                                pInput->get_name( &nazwa);

                                if ( WideString(nazwa) == WideString("username") )  //wartosc name edit-a LOGIN (ze zrodel strony)
                                {
                           //     ShowMessage("username");
                                  pInput->put_value (L"tester"); //faktyczny login
                                }
                                if ( WideString(nazwa) == WideString("password") ) //wartosc name edit-a PASSWORD (ze zrodel strony)
                                {
                                //  ShowMessage("password");
                                  pInput->put_value (L"tester007"); //faktyczny passw


                                                IHTMLFormElement *HTMLForm = NULL;
                                                pInput->get_form(&HTMLForm);

                                                if (HTMLForm)
                                                {
                                                        HTMLForm->submit();  //tutaj powinno nastapic logowanie usera. Niestety
                                                        HTMLForm->Release();
                                                }
                                }
                                pInput->Release();

                        }
                        pDisp->Release();

                  }
                }

        }
  }
  pAll->Release();


HTMLDoc->Release();
}


Powyższy kod uzupełnia pola edit dla username i password, potem robi potwierdzenie. No i niestety ten submit nie powoduje zalogowania do strony.
Wiecie może dlaczego?
Avatar użytkownika
mckri
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): piątek, 15 sierpnia 2008, 13:48
Podziękował : 10
Otrzymał podziękowań: 2
System operacyjny: Windows Vista SP2
Kompilator: BCB 5/2007/2009
    Windows VistaOpera

Re: Logowanie przez IdHTTP

Nowy postprzez polymorphism » środa, 18 maja 2011, 14:52

Spróbuj wywołać metodę click na przycisku/elemencie submit, choć podejrzewam, że efekt będzie ten sam, ale kto wie.

--- dodane ---

Właśnie sprawdziłem, czy metoda click działa, i wygląda, że tak (testowałem poprzez OLE Automation).
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Logowanie przez IdHTTP

Nowy postprzez mckri » środa, 18 maja 2011, 21:20

polymorphism, czy mógłbyś podać kod, którym to zrobiłes?
Avatar użytkownika
mckri
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): piątek, 15 sierpnia 2008, 13:48
Podziękował : 10
Otrzymał podziękowań: 2
System operacyjny: Windows Vista SP2
Kompilator: BCB 5/2007/2009
    Windows VistaOpera

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 1 gość

cron