begin process at 2013 05 25 18:48:54
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Delphi

 > 

Réseau & Internet

 > 

Internet

 > 

adresse ip derriere routeur - D5/XE2


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

adresse ip derriere routeur - D5/XE2

jeudi 27 septembre 2012 à 11:13:28 | adresse ip derriere routeur - D5/XE2

simonpelloquin

Membre Club
Bonjour,

Pour résumer, la source http://www.delphifr.com/codes/ADRESSE-IP-DERRIERE-ROUTEUR-ENVOIE-FTP-AVEC-WININET_33323.aspx permettait de récupérer son ip à partir d'un petit fichier php sur un serveur (<?php echo $_SERVER['REMOTE_ADDR']; ?>). J'ai isolé la fonction donneIP et m'en suis resservi dans un programme.

Code Delphi :
function DonneIp: string;
var
  hSession: HINTERNET;
  hService: HINTERNET;
  RcvBuffer: array[0..255] of Char;
  dwSize, Reserved: DWORD;
  sAppName: string;
  sUrl  : string;
begin
     sUrl := 'http://www.monsite.fr/Identification_IP/Send_ip.php';
     sAppName := ExtractFileName(Application.ExeName);
     hSession := InternetOpen(PChar(sAppName), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
     try
        hService := InternetOpenUrl( hSession, PChar(sUrl), nil, 0, 0, 0);
        RcvBuffer := '';
        dwSize := sizeof(RcvBuffer);
        Reserved := 0;
        InternetReadFile(hService, @RcvBuffer, 1024, dwSize);
        Result:= String(RcvBuffer);
     finally
            InternetCloseHandle(hService);
            InternetCloseHandle(hSession)
     end;
end;


Tout allait très bien sous delphi 5...
J'essaie cette fonction sous XE2 et catastrophe, voici à quoi ressemble mon ip : '&#14648;&#14382;'#$2E33'&#14129;'#$2E39'&#13873;9' (qui doit normalement être '89.83.179.169', en tous cas, sous D5)

Sous D5, j'ai RcvBuffer = ('8', '9', '.', '8', '3', '.', '1', '7', '9', '.', '1', '6', '9', #0, #0, #0, ...
Sous XE2, j'ai RcvBuffer = ('&#14648;', '&#14382;', #$2E33, '&#14129;', #$2E39, '&#13873;', '9', #0, #0, #0, ...

Vu que ça fonctionne sous D5, je suis tenté de me dire que le problème vient d'XE2.
Quelque chose a dû m'échapper, mais quoi...

Je sollicite votre aide pour la résolution de ce problème qui commence à me prendre la tête, merci d'avance pour vos réponses.

Simon
jeudi 27 septembre 2012 à 13:03:15 | Re : adresse ip derriere routeur - D5/XE2

Caribensila

Membre Club
Réponse acceptée !
Salut Simon,

Depuis Delphi 2009, Delphi utilise l'Unicode.

Donc :
Pchar à mettre en PAnsiChar
String à mettre en AnsiString, etc...


Et comme tu rencontreras probablement d'autres problèmes d'adaptation d'anciens codes dû à ce changement de format, je te conseille de lire ce PDF pour éviter les inévitables prises de tête futures.
jeudi 27 septembre 2012 à 14:05:50 | Re : adresse ip derriere routeur - D5/XE2

Guillemouze

Voila un document qui m'a l'air très intéressant Cari.
Merci pour le lien
jeudi 27 septembre 2012 à 14:24:15 | Re : adresse ip derriere routeur - D5/XE2

simonpelloquin

Membre Club

Merci Cari !!!

Bon, je me doutais bien qu'il y avait un truc dans le genre. Lors de la réunion XE2 à Bordeaux, Thierry Laborde avait demandé à l'assemblée si la migration Unicode n'avait pas été trop douloureuse... Je comprends mieux maintenant. J'avoue, je ne me suis pas encore penché sur le sujet (c'est un tort je suppose) car je n'avais jamais rencontré ce problème. Je vais lire le document que tu me recommandes et m'informer un peu plus. Merci encore.

Simon
vendredi 28 septembre 2012 à 13:42:14 | Re : adresse ip derriere routeur - D5/XE2

cirec

Membre Club Administrateur CodeS-SourceS
Réponse acceptée !
ATTENTION
Caribensila a écrit

Donc :
Pchar à mettre en PAnsiChar
String à mettre en AnsiString, etc...



Non, non et non ...
ne commencez pas à jouer à ceci avant d'être certain de ce que vous allez faire .... je l'ai déjà dit à plusieurs reprise (voir ici:)

tout ça est encore tout nouveau pour beaucoup de dev et corriger des années de mauvaises habitudes ne se fait pas en un jour ...

Donc changer tous les types n'est pas utile si on utilise les types génériques (PChar, Char, string ...)
sauf cas particulier comme nous en avons un bel exemple ici.

En ce qui concerne ce code, le problème ne vient pas de Delphi lui même mais soit de la fonction "InternetReadFile" qui attend un pointeur sur AnsiChar ou du Serveur qui ne renvoie que de l'AnsiChar ??? je ne sais pas

Toujours est il, j'ai téléchargé le code et je n'ai changé qu'une toute petite chose.
Code testé compilé sous Unicode dans la fonction "DonneIp":
Code Delphi :
function DonneIp(s: string): string;
var
  hSession: HINTERNET;
  hService: HINTERNET;
  RcvBuffer: array[0..255] of AnsiChar;// *** <<---
  dwSize, Reserved: DWORD;
  sAppName: string;
begin
  sAppName := ExtractFileName(Application.ExeName);
  hSession := InternetOpen(PChar(sAppName), INTERNET_OPEN_TYPE_PRECONFIG,
               nil, nil, 0);
  try
    hService := InternetOpenUrl( hSession, PChar(s), nil, 0, 0, 0);
    RcvBuffer := '';
    dwSize := SizeOf(RcvBuffer);
    Reserved := 0;
    InternetReadFile(hService, @RcvBuffer, dwSize, dwSize);
    Result:= string(RcvBuffer);
  finally
    InternetCloseHandle(hService);
    InternetCloseHandle(hSession);
  end;
end;


et voilà tout fonctionne


@+Cirec
samedi 29 septembre 2012 à 09:00:08 | Re : adresse ip derriere routeur - D5/XE2

simonpelloquin

Membre Club

Ok Cirec, bien noté. Merci pour ce complément d'information.

Simon


Cette discussion est classée dans : string, ip, d5, xe2, rcvbuffer


Répondre à ce message

Sujets en rapport avec ce message

Sous Class [ par delphi ] Salut je voudrais savoir comment passer une sous class avec delphi ??par exemple avec vb ça se fait comme ça :Public Declare Function ShowWindow Lib " lancement d'un fichier au démarrage de l'application [ par Pierre ] Comment est-il possible, en Delphi, de lancer un fichier (.txt par exemple comme je l'indique ci-après) au démarrage sans que la TForm apparaisse ? Av FABIIN aide moi [ par Le NeWbIe ] Salut,J'ai vu ta source pour récupérer ton ip local, arriverais-tu à établir une connection et ensuite envoyer des données en TCP/IPMerci a+ limitation de sendtext ? [ par Xavier ] Bonjour,Comme la fonction sendtext prend en parametre un string et sachant qu'un string peut faire 2 Mo, pensez-vous qu'il est raisonnable d'utiliser Pb avec TListView et TListItem [ par Biose ] Salut à tous, Voilà mon problème, je me sert d'une ListView et à ma premiere action, je rempli ma premiere colonne ://ici "ori" à une valeur String et Comment recupèrer l'ip des Serveur se connectant à un client [ par g0belin ] Comment recupèrer l'ip des Serveur se connectant à un client par exemple dans un chat et apres ecrire ces ip dans un memo. Prendre les deux derniers caractères d'une string... [ par ELECTRORESiSTiK ] Salut,Pourriez-vous m'expliquer comment prendre les deux dernier caractères d'une string ?Merci d'avance!Bonne Soirée Récupérer l'adresse IP ! [ par LesDelphistes ] Bonjour, Je souhaiterai trouver une solution pour pouvoir récupérer l'adresse IP de ma machine connectée TCP/IP (Internet par exemple) sans utilise Questions [ par SMoG ] yop ;)je sollicite de votre bienveillance pour .. heu nan :)Quelle est l'API pour choper l'IP en cours ?Comment faire communiquer deux ip ? (le premie String déjà existante... [ par finipe ] Bonjour à tous ! J'ai deux problèmes à vous soumettre :- Dans un programme je passe des items d'une combobox à une listbox, d'un simple clique de bout


Nos sponsors


Sondage...

CalendriCode

Mai 2013
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,515 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales