IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

Indy10 + TidHTTP - violation d'accès


Sujet :

Delphi

  1. #1
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut Indy10 + TidHTTP - violation d'accès
    Bonjour à tous,

    après plusieurs tentatives de récupération du code source d'une page Web avec le TWebBrower déclenchant certaines anomalies de manière intempestive, j'ai installé les composants Indy10.

    Ces derniers sont correctement installés et les bibliothèques en place (je suis sous D7 et seven 32 bits)

    j'ai toutefois deux palettes :

    Indy- Clients (33 composants) et
    Indy Client (5 composants)

    sur cette procédure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    procedure DownloadHTTP(const AUrl: string; out DestStream: TStream);
    begin
      with TIdHTTP.Create(Application) do
      try
        try
          Get(AUrl, DestStream);
        except
          on e: Exception do
            MessageDlg(Format('Erreur : %s', [e.Message]), mtInformation, [mbOK], 0);
        end;
      finally
        Free;
      end;
    end;
     
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      Page: TStream;
    begin
      DownloadHTTP('http://www.developpez.com', Page);   // quelque soit l'adresse http..
      Memo1.Lines.LoadFromStream(Page);
    end;
    J'ai une méchante violation d'accès sur le Get qui se produit à cet endroit dans le code source du composant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    
    
    procedure TIdCustomHTTP.DoRequest(const AMethod: TIdHTTPMethod;
      AURL: string; ASource, AResponseContent: TStream;
      AIgnoreReplies: array of SmallInt);
    var
      LResponseLocation: Integer;
    begin
      if Assigned(AResponseContent) then
      begin
        LResponseLocation := AResponseContent.Position;     //// <------- ICI !
      end
      else
      begin
        LResponseLocation := 0; // Just to avoid the waringing message
      end;
    
      FAuthRetries := 0;
      FAuthProxyRetries := 0;
    
      Request.URL := AURL;
      Request.Method := AMethod;
      Request.Source := ASource;
      Response.ContentStream := AResponseContent;
    
      try
        repeat
          Inc(FRedirectCount);
    
          PrepareRequest(Request);
          if IOHandler is TIdSSLIOHandlerSocketBase then begin
            TIdSSLIOHandlerSocketBase(IOHandler).URIToCheck := FURI.URI;
          end;
          ConnectToHost(Request, Response);
    
          // Workaround for servers wich respond with 100 Continue on GET and HEAD
          // This workaround is just for temporary use until we have final HTTP 1.1
          // realisation. HTTP 1.1 is ongoing because of all the buggy and conflicting servers.
          repeat
            Response.ResponseText := IOHandler.ReadLn;
            FHTTPProto.RetrieveHeaders(MaxHeaderLines);
            ProcessCookies(Request, Response);
          until Response.ResponseCode <> 100;
    
          case FHTTPProto.ProcessResponse(AIgnoreReplies) of
            wnAuthRequest: begin
                Dec(FRedirectCount);
                Request.URL := AURL;
              end;
            wnReadAndGo: begin
                ReadResult(Response);
                if Assigned(AResponseContent) then begin
                  AResponseContent.Position := LResponseLocation;
                  AResponseContent.Size := LResponseLocation;
                end;
                FAuthRetries := 0;
                FAuthProxyRetries := 0;
              end;
            wnGoToURL: begin
                if Assigned(AResponseContent) then begin
                  AResponseContent.Position := LResponseLocation;
                  AResponseContent.Size := LResponseLocation;
                end;
                FAuthRetries := 0;
                FAuthProxyRetries := 0;
              end;
            wnJustExit: Break;
            wnDontKnow: raise EIdException.Create(RSHTTPNotAcceptable);
          end;
        until False;
      finally
        if not Response.KeepAlive then begin
          Disconnect;
        end;
      end;
      FRedirectCount := 0;
    end;
    Merci de vos conseils

  2. #2
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Ton Stream ( Page: TStream; ) , il est créé où ??? Elle est là la violation d'accès

    Tu mettras le Page.Free; quelque part aussi, n'oublie pas

  3. #3
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut yès my lady
    dormi 2 heures, pas bien réveillé ..


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      Page: TStream;
    begin
      Page := TStream.Create;
    try
      DownloadHTTP('http://www.developpez.com', Page);  
      Memo1.Lines.LoadFromStream(Page);
      finally
      Page.Free;
    end;
     
    end;
    mais maintenant, j'ai une erreur :
    ---------------------------
    Notification d'une exception du débogueur
    ---------------------------
    Le projet Project1.exe a provoqué une classe d'exception EStreamError avec le message 'TStream.Seek non implémenté'. Processus stoppé.
    ---------------------------


    merci

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 796
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 796
    Points : 13 475
    Points
    13 475
    Par défaut
    TStream est une classe de base qu'on instancie jamais directement. Utilise un descendant de TStream, TMemoryStream par exemple.

  5. #5
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut TMemoryStream
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    procedure DownloadHTTP(const AUrl: string; out DestStream: TMemoryStream);
    begin
      with TIdHTTP.Create(Application) do
      try
        try
          Get(AUrl, DestStream);
        except
          on e: Exception do
            MessageDlg(Format('Erreur : %s', [e.Message]), mtInformation, [mbOK], 0);
        end;
      finally
        Free;
      end;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      Page: TMemoryStream;
    begin
      Page := TMemoryStream.Create;
     
      DownloadHTTP('http://www.developpez.com', Page);
     
      Memo1.Lines.LoadFromStream(Page);
     
      Page.Free;
    end;
    Je n'ai effectivement plus de message d'erreur, mais, le programme ne passe pas par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      Memo1.Lines.LoadFromStream(Page);
    toutefois, certaines adresses http passent le DownloadHTTP, mais toujours rien dans le Memo...


    merci

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 399
    Points : 646
    Points
    646
    Par défaut
    rajoute DestStream.Position := 0;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure DownloadHTTP(const AUrl: string; out DestStream: TMemoryStream);
    begin
      with TIdHTTP.Create(Application) do
      try
        try
          Get(AUrl, DestStream);
          DestStream.Position := 0;
        except
        
        end;
      finally
        Free;
      end;
    end;

  7. #7
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    N'empêches que il y a plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    procedure DownloadHTTP(const AUrl: string; AStringList: TStrings);
    begin
      with TIdHTTP.Create(Application) do
      try
        try
          AStringList.Text:= Get(AUrl);
        except
     
        end;
      finally
        Free;
      end;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      DownloadHTTP('http://www.developpez.com', Memo1.Lines);   // quelque soit l'adresse http..
    end;
    Voilà, comme ça il n'y a plus de Stream qui se ballade

    Edit : j'avais laissé une ligne en trop dans le code...

  8. #8
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut Indy 10
    Bonsoir,

    merci infiniment à tous.

    je teste tous les codes dès que je peux,
    et vous tiens au courant.

    @bientôt

  9. #9
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut Suite..
    Bonjour,

    Tout d'abord un aveu, je n'ai jamais utilisé les composants Indy.
    et une observation..
    la procédure avec le Stream est extraire de la FAQ du site..

    Ceci étant dit

    @exoseven:
    l'ajout de cette ligne ne peut rien arranger puisque le plantage se fait sur le Get et donc avant.

    @LadyWasky:
    ton code fonctionne nickel chrome.
    je sens une femme courageuse, énergique, combattante, qui a du chien
    je me trompe ?

    je me demande pourquoi avec Le stream ça ne fonctionne pas..
    peut-être que ce code fonctionne qu'avec Indy 6 et Indy 9 et pas Indy 10.

    en tout cas Bravo et merci !

    @+

  10. #10
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2005
    Messages
    1 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 1 015
    Points : 2 085
    Points
    2 085
    Par défaut indy
    Bonjour cantador,
    J'utilise le composant Idhttp (de Indy 10) avec Delphi XE starter sous Windows 10 1511 64 bits pour récupérer mon adresse IP de connexion soit sur un site spécialisé (genre monIp.com) ou dans la box (dans ce cas il faut s'authentifier) avec un code en tous points semblables et ça marche parfaitement. Par contre pour une raison que je n'ai pas identifiée il faut quelquefois réitérer le Get pour la box , mais il y n'y a jamais de message d'erreur.
    Indy 10 est celui livré d'origine avec XE starter. Pour info : les sources de Indy sont du 04/11/2010 06:11 et par exemple idHTTP.pas fait 74.2 ko
    pour info :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    procedure TForm1.BnGetClick(Sender: TObject);
     
    var
      get_url: string;
      resp: TMemoryStream;
      MonIP: string;
      StringlIstResult: Tstringlist;
      message: string;
    begin
      Screen.Cursor := crHourGlass; //crDefault;
     
      // pas indispensable
      IdHTTP1.Request.UserAgent :=
        'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1';
     
      if RgSceIp.ItemIndex = 1 then
      begin
        //    pour accéder a la box il faut s'identifier
        IdHTTP1.Request.BasicAuthentication := true;
        IdHTTP1.Request.Username := 'admin';
        IdHTTP1.Request.Password := 'password';
      end;
     
      get_url := EditUrl.text;
     
      resp := TMemoryStream.Create;
      try
        IdHTTP1.Get(get_url, resp); //  ok pour netgear   et ipinfo
        resp.Position := 0;
        memo1.Lines.LoadFromStream(resp);
      finally
        resp.Free;
      end;

  11. #11
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par cantador Voir le message
    @LadyWasky:
    ton code fonctionne nickel chrome.
    je sens une femme courageuse, énergique, combattante, qui a du chien
    je me trompe ?
    Oui de beaucoup, vie compliquée, obligée de faire face, avec des GROS coups de mou comme n'importe qui le vivrais à ma place, enfin bon, c'est pas trop le sujet ici.
    Citation Envoyé par cantador Voir le message
    je me demande pourquoi avec Le stream ça ne fonctionne pas..

    @+
    Parce que tu n'as pas trop compris comment ça fonctionnais en fait, sauf qu'en plus le composant n'a pas l'air d'étre bien codé pour alimenter un stream (tu n'as vraiment pas de bol) On résume :
    1)Ton Stream n'était pas créé (donc égal à nil). Ca tu as corrigé, good
    2) TStream ne fonctionne pas parce que c'est une classe de base, donc, à la place il faut créer un descendant fonctionnel comme TMemoryStream, fait
    3) L'idéal serait de carrément d'aller regarder le code de GetUrl(), mais j'ai pas le temps

  12. #12
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut Indy 10
    Bonjour,

    @gaby277:
    ton code m'intéresse car ici, il faut utiliser FF (c'est comme ça, et tout est fait pour faire planter IE..)

    Bref, mais RgSceIp n'est pas défini, dommage.

    à moins que tu fasses l'effort de corriger..

    Par contre pour une raison que je n'ai pas identifiée il faut quelquefois réitérer le Get pour la box
    en revanche, çe truc ne me plait du tout vu le nombre de pages que j'ai à récupérer.

    donc, à voir pour la suite

    @LadyWasky:
    je n'ai pas fait beaucoup d'erreur...
    et grâce à ton code, j'ai écrit un parser et traiter 2000 pages d'un site à l'abandon
    et je viens à l'instant de tout stocker dans un tableau EXCEL.

    le père cantador apprend très vite ! (qi + qe)

    Pour info, François Piette que je connais un peu vient de m'envoyer mail et me recommande d'utiliser
    ses composants ICS à la place d'Indy (comme quoi les bonne relations ça sert quelquefois..)
    ce qui rejoint un peu tes remarques sur le codage d'Indy..

    Mais cela dit, je me garderai bien de critiquer..

    merci LadyWasky

    et ne te fais pas de soucis, avec un tel potentiel, tu iras loin.

    @bientôt

  13. #13
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2005
    Messages
    1 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 1 015
    Points : 2 085
    Points
    2 085
    Par défaut Indy
    @ Cantador
    Bonjour,
    Pour répondre a ta question :

    RgSceIp est un radio group avec deux options :
    Récuperer mon adresse IP de connection
    1 - à partir d'un site internet en l'occurrence 'http://www.findipinfo.com' mais il y en des quantités d'autres
    2- à partir de ma box (Modem routeur Netgear DGN 3500).

    Il rempli un edit soit avec l'adresse IP d'un site internet soit avec la page de la box qui affiche mon adresse IP
    La page de la box qui affiche l'IP de connexion n'est pas la même pour toutes les box. Dans les deux cas il faut regarder au préalable le code source de la page qui affiche l'IP (pour le modem c'est dans une frame, mais a part ça la récupération utilise le même principe).


    Les adresses IP récupérées sont bien évidemment identiques. Je me suis amusé à récupérer aussi dans la box puisque tous les exemples que j'ai trouvé sur Internet la récupèrent sur un site internet.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Const
    cHttpMonIP = 'http://www.findipinfo.com'; // adresse d'un site internet
    cHttpMabox = 'http://192.168.1.1/s_status.htm';  // adresse de la box
     ......
    Procedure TForm1.RgSceIpClick(Sender: TObject);
    begin
      if RgSceIp.ItemIndex = 1 then
        EditUrl.Text := cHttpMabox
      else
        EditUrl.Text := cHttpMonIP;
    end;
    En fait si je laisse l'authentification de la box pour le site internet ça ne gene pas la récup de l'IP. Pourquoi quelquefois ça ne marche pas : a vrai dire je n'ai pas fait l'effort de chercher, simplement après le get je vérifie et si nécessaire je relance le get.

    En espérant avoir répondu a ta question

  14. #14
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Ha oui, les composants de François Piette sont vraiment super.
    En tout cas je suis heureuse que tu t'en sois sorti, vraiment.

  15. #15
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2005
    Messages
    1 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 1 015
    Points : 2 085
    Points
    2 085
    Par défaut Indy
    @ LadyWasky
    Bonjour,
    Ha oui, les composants de François Piette sont vraiment super
    Heu effectivement La suite des composants "ICS" est effectivement super mais "Indy" dont il y a été question dans ce fil ... c'est pas de François Piette. A l'époque au contraire c'était plutôt des suites concurentes et chacune avait ses partisans (de mémoire une suite avait des sockets bloquants et pas l'autre). Indy n'est plus maintenue depuis longtemps alors qu'ICS est encore mise a jour. Rendons à César ... tu connais la suite .....

  16. #16
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut la remontée de Gaby277..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    procedure TForm1.Button2Click(Sender: TObject);
    var
      get_url: string;
      resp: TMemoryStream;
      MonIP: string;
      StringlIstResult: Tstringlist;
      message: string;
    begin
      Screen.Cursor := crHourGlass; //crDefault;
     
      // pas indispensable
      IdHTTP1.Request.UserAgent := 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1';
     
    {  if RgSceIp.ItemIndex = 1 then
      begin
        //    pour accéder a la box il faut s'identifier
        IdHTTP1.Request.BasicAuthentication := true;
        IdHTTP1.Request.Username := 'admin';
        IdHTTP1.Request.Password := 'password';
      end;   }
     
      get_url := EditUrl.text;
     
      resp := TMemoryStream.Create;
      try
        IdHTTP1.Get(get_url, resp); //  ok pour netgear   et ipinfo
        resp.Position := 0;
        memo1.Lines.LoadFromStream(resp);
      finally
        resp.Free;
      end;
     
    end;
    effectivement, le code marche désormais avec une adresse internet
    je ne peux pas tester la box, car ici, tout est verrouillé et interdit.
    je garde ton code en archive.
    mon problème a cependant été résolu avec le code de LadyWasky.
    je vais regarder au plus près ICS et potasser la doc.

    merci

    @bientôt

  17. #17
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2005
    Messages
    1 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 1 015
    Points : 2 085
    Points
    2 085
    Par défaut Recup page internet
    @ cantador

    J'ai testé également avec les composants ICS pour récuperer mon adresse IP et la renvoyer par mail sur mon smartphone pour consulter à distances mes cameras IP (avec du port forwarding) Je suis allergique au cloud.

    Voila le code "en l'état" pas fini mais qui marche. Il résulte essentiellement d'une démo livrée avec ICS.
    Les composants ICS sont biens (pas bogués), disponibles pour les versions récentes de Delphi, avec beaucoup plus de possibilités il me semble qu'Indy. Mais le problème pour les bidouilleurs du Dimanche, dont je fais partie, c'est la doc qui se limite a quelques démos complètes, mais qui font se poser beaucoup de questions, souvent sans réponses sur le code . Bon je sais l'informatique ça se mérite ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    {* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
     
    Author:       François PIETTE
    Creation:     December 5, 1997
    Version:      1.02
    Description:  Sample program to demonstrate some of the THttpCli features.
    EMail:        francois.piette@overbyte.be  http://www.overbyte.be
    Support:      Use the mailing list twsocket@elists.org
                  Follow "support" link at http://www.overbyte.be for subscription.
    Legal issues: Copyright (C) 1997-2010 by François PIETTE
                  Rue de Grady 24, 4053 Embourg, Belgium. Fax: +32-4-365.74.56
                  <francois.piette@overbyte.be>
     
                  This software is provided 'as-is', without any express or
                  implied warranty.  In no event will the author be held liable
                  for any  damages arising from the use of this software.
     
                  Permission is granted to anyone to use this software for any
                  purpose, including commercial applications, and to alter it
                  and redistribute it freely, subject to the following
                  restrictions:
     
                  1. The origin of this software must not be misrepresented,
                     you must not claim that you wrote the original software.
                     If you use this software in a product, an acknowledgment
                     in the product documentation would be appreciated but is
                     not required.
     
                  2. Altered source versions must be plainly marked as such, and
                     must not be misrepresented as being the original software.
     
                  3. This notice may not be removed or altered from any source
                     distribution.
     
                  4. You must register this software by sending a picture postcard
                     to the author. Use a nice stamp and mention your name, street
                     address, EMail address and any comment you like to say.
     
    Updates:
    Jan 16, 1998  V1.01 Added a proxy edit box.
    Aug 18, 2001  V1.02 Shay Horovitz <shay@imesh.com> corrected a small bug
                  in LoadMemoFromMemoryStream.
     
     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
     
     //FGFG 28/02/16     recup mon IP OK
    unit OverbyteIcsHttpDmo1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, OverbyteIcsHttpProt, ExtCtrls, OverbyteIcsWndControl,
      OverbyteIcsStreams, IdBaseComponent, IdComponent, IdTCPConnection,
      IdTCPClient, IdHTTP;
     
    const
      HttpDemoVersion = 102;
      CopyRight = ' HttpDemo (c) 1997-2010 by Francois PIETTE. V1.02';
     
    type
      THttpToMemoForm = class(TForm)
        Panel1: TPanel;
        Label1: TLabel;
        URLEdit: TEdit;
        GoButton: TButton;
        HttpCli1: THttpCli;
        DisplayMemo: TMemo;
        Label2: TLabel;
        ProxyEdit: TEdit;
        BnGo2: TButton;
        EditAdresseIP: TEdit;
        Label3: TLabel;
        IdHTTP1: TIdHTTP;
        procedure GoButtonClick(Sender: TObject);
        procedure Panel1Resize(Sender: TObject);
        procedure BnGo2Click(Sender: TObject);
        procedure FormShow(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      HttpToMemoForm: THttpToMemoForm;
     
    implementation
     
    {$R *.DFM}
     
    {* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
     
    procedure LoadMemoFromMemoryStream(Memo: TMemo; Stream: TMemoryStream);
    var
      Reader: TIcsStreamReader;
      Line: string;
    begin
      Stream.Position := 0;
      Reader := TIcsStreamReader.Create(Stream, TRUE, CP_ACP);
      try
        while Reader.ReadLine(Line) do
          Memo.Lines.Add(Line);
      finally
        Reader.Free;
      end;
    end;
     
    {* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
     
    procedure THttpToMemoForm.BnGo2Click(Sender: TObject);
    var
      Data: TMemoryStream;
    begin
      DisplayMemo.Clear;
      BnGo2.Enabled := FALSE;
      Data := TMemoryStream.Create;
     
      try
     
        // pour connection netgear
        httpcli1.Password := 'password';
        httpcli1.Username := 'admin';
    //    httpcli1.ServerAuth := httpAuthBasic;
       // httpcli1.URL := URLEdit.Text;
        //httpcli1.Proxy := ProxyEdit.Text;
        //httpcli1.ProxyPort := '80';
        httpcli1.RcvdStream := Data;
        httpcli1.Get;
        LoadMemoFromMemoryStream(DisplayMemo, Data);
      finally
        Data.Free;
        BnGo2.Enabled := TRUE;
      end;
    end;
     
    //FGFG a faire pour recupere IP rechercher dans memo 'Your IP Address Is: 82.121.255.100<form method="post">'
     
    procedure THttpToMemoForm.FormShow(Sender: TObject);
    begin
      URLEdit.Text :='192.168.1.1/s_status.htm';
    end;
     
    procedure THttpToMemoForm.GoButtonClick(Sender: TObject);
    var
      Data: TMemoryStream;
      s: longint;
      temp: string;
    begin
      DisplayMemo.Clear;
     
      GoButton.Enabled := FALSE;
      Data := TMemoryStream.Create;
      try
        httpcli1.URL := URLEdit.Text;
        httpcli1.Proxy := ProxyEdit.Text;
        httpcli1.ProxyPort := '80';
        httpcli1.RcvdStream := Data;
        httpcli1.Get;
        LoadMemoFromMemoryStream(DisplayMemo, Data);
     
    //    ///////////////////////////////////
    ////  xmlhttp.SetRequestHeader('User-Agent',
    ////      'Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3');
    ////    xmlhttp.send(null);
    ////  except
    ////    exit;
    ////  end;
    ////  if (xmlhttp.status = 200) then
    ////    temp := trim(VarToStr(xmlhttp.responseText));
    ////  xmlhttp := Unassigned;
    //    s := pos('Your IP Address Is:', DisplayMemo.Text);
    //    if s > 0 then
    //      inc(s, 19)
    //    else
    //      exit;
    //    temp := copy(DisplayMemo.Text, s, 17);
    //    s := pos('<', temp);
    //    if s = 0 then
    //      exit
    //    else
    //      dec(s);
    //    //result := trim(copy(temp, 1, s));
    //    temp := trim(copy(temp, 1, s));
    //    EditAdresseIP.Text := temp;
    //    // Your IP Address Is: 82.121.255.100<form method="post">
    //
    //      ////////////////
     
     
    // FGFG en cours 01/3/2016
    /////////////////Reponse modem   DGN 3500
    //<td width="50%"><b>Adresse MAC </b></td>
    //<td width="50%">00:26:F2:3E:69:37</td>
    //</tr>
    //<tr>
    //<td width="50%"><b>Adresse IP </b></td>
    //<td width="50%">82.121.127.123</td>
    //</tr>
     
    // A modifier en fonction reponse modem
    //    s := pos('Your IP Address Is:', DisplayMemo.Text);
    //    if s > 0 then
    //      inc(s, 19)
    //    else
    //      exit;
    //    temp := copy(DisplayMemo.Text, s, 17);
    //    s := pos('<', temp);
    //    if s = 0 then
    //      exit
    //    else
    //      dec(s);
    //    //result := trim(copy(temp, 1, s));
    //    temp := trim(copy(temp, 1, s));
    //    EditAdresseIP.Text := temp;
    //    // Your IP Address Is: 82.121.255.100<form method="post">
    //
    //      ////////////////
     
     
     
      finally
        Data.Free;
        GoButton.Enabled := TRUE;
      end;
    end;
     
     
    {* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
     
    procedure THttpToMemoForm.Panel1Resize(Sender: TObject);
    begin
      GoButton.Left := Panel1.Width - GoButton.Width - 8;
      URLEdit.Width := Panel1.Width - URLEdit.Left - GoButton.Width - 16;
      ProxyEdit.Width := URLEdit.Width;
    end;
     
    {* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
     
    end.

  18. #18
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 166
    Points : 41 348
    Points
    41 348
    Billets dans le blog
    63
    Par défaut
    Bonjour
    Citation Envoyé par gaby277 Voir le message
    Indy n'est plus maintenue depuis longtemps alors qu'ICS est encore mise à jour.
    Indy est en version 14 effectivement la version 10 n'est plus maintenue mais on pourrait dire la même chose des premières versions d'ICS .
    Gros avantage ICS est en freeware à contrario de Indy,
    Inconvénient, comme souligné, le manque de doc et encore pas de portage Androïd

    Il est vrai que la suite ICS est géniale et plus rapide, il y a notamment un verrou/timer windows qui saute avec (j'ai posté cela quelque part).

  19. #19
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2005
    Messages
    1 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 1 015
    Points : 2 085
    Points
    2 085
    Par défaut indy
    Bonjour
    Indy est en version 14
    J'ignorai que la suite Indy était devenue payante et est maintenant en version 14.

    Pour les problèmes qu'a rencontré Cantador je crois me souvenir qu'à l'époque de la sortie de XE j'avais lu (sur Développez ?) qu'il fallait impérativement utiliser la version 10 (livrée avec Delphi) et pas la version 10 qui était en téléchargement sur le site Indy à l'époque.
    C’est pour cela que je lui ai indiqué la taille et la date de IdHTTP.pas, mais à tort sans préciser pourquoi, c'est réparé.
    C'est vrai que la documentation est un vrai problème surtout pour les gens qui ne sont pas des pros à temps complet.
    Et là je parle de trucs très très basiques sur lesquels j'ai un peu buté pour envoyer des mails avec idsmtp :
    toute la série des "names" 'Helo name' , 'user name' et autres .... Sans parler du type d'authentification de son FAI
    Bon il suffit d'essayer avec les valeurs par défaut dans un premier temps...
    C'est bien que des auteurs publient des sources conséquentes (c'est de plus en plus rare) et je leurs en suit reconnaissant, mais un peu plus de commentaires seraient bienvenus.

  20. #20
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 166
    Points : 41 348
    Points
    41 348
    Billets dans le blog
    63
    Par défaut
    Bonjour,
    Citation Envoyé par gaby277 Voir le message
    J'ignorai que la suite Indy était devenue payante et est maintenant en version 14.
    elle l'a toujours été en fait, un peu comme tous les add-on delphi (que ce soit Rave, Quickreport, fastreport, TChart etc...) l'éditeur (<<ce qui me permet d'éviter la liste Borland/../Codegear/Embarcadero/Idera) de Delphi ne nous proposait toujours une version lite (i.e. Intraweb bloqué sur un certain nombre de connexion, fastreport sans possibilité d'utiliser les events etc...)
    mais effectivement la version fournie de base pour xe10 est 10.6.2

    Pour les problèmes qu'a rencontré Cantador je crois me souvenir qu'à l'époque de la sortie de XE j'avais lu (sur Développez ?) qu'il fallait impérativement utiliser la version 10 (livrée avec Delphi) et pas la version 10 qui était en téléchargement sur le site Indy à l'époque.
    j'ai effectivement parlé d'un problème de ce genre avec XE4, mais à l'inverse il fallait charger la version sur le serveur de Atozed (problème fuites mémoires etc...) je ne parle pas de la galère pour une "simple" mise à jour heureusement depuis il y a un un bon tuto de dany leblanc aka skywaukers sur Intraweb et qui en introduction en parle

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. ReportPrinterDialog (QR2) : violation d'accès..
    Par Harry dans le forum Bases de données
    Réponses: 5
    Dernier message: 30/12/2004, 14h04
  2. [XMLDocument] Violation d'accès
    Par xant dans le forum Composants VCL
    Réponses: 8
    Dernier message: 29/09/2004, 15h39
  3. requete / violation d'accès
    Par marie253 dans le forum Bases de données
    Réponses: 4
    Dernier message: 13/08/2004, 13h29
  4. Violation d'acces apres Execute
    Par SegmentationFault dans le forum Connexion aux bases de données
    Réponses: 6
    Dernier message: 10/08/2004, 16h23
  5. Violation d'accès apres Close
    Par SegmentationFault dans le forum Bases de données
    Réponses: 3
    Dernier message: 05/07/2004, 16h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo