Adresse ip derriere routeur - D5/XE2 [Résolu]

sp40 1293 Messages postés mardi 28 octobre 2003Date d'inscriptionContributeurStatut 3 juillet 2015 Dernière intervention - 27 sept. 2012 à 11:13 - Dernière réponse : sp40 1293 Messages postés mardi 28 octobre 2003Date d'inscriptionContributeurStatut 3 juillet 2015 Dernière intervention
- 29 sept. 2012 à 09:00
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.

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 : '㤸㠮'#$2E33'㜱'#$2E39'㘱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 = ('㤸', '㠮', #$2E33, '㜱', #$2E39, '㘱', '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
Afficher la suite 

Votre réponse

5 réponses

Meilleure réponse
Caribensila 2684 Messages postés jeudi 15 janvier 2004Date d'inscription 26 juillet 2018 Dernière intervention - 27 sept. 2012 à 13:03
3
Merci
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.

Merci Caribensila 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de Caribensila
Meilleure réponse
Cirec 4231 Messages postés vendredi 23 juillet 2004Date d'inscription 3 août 2018 Dernière intervention - 28 sept. 2012 à 13:42
3
Merci
ATTENTION

[quote=Caribensila]Donc :
Pchar à mettre en PAnsiChar
String à mettre en AnsiString, etc...

/quote

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":
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

[hr]@+Cirec
[hr]

Merci Cirec 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de Cirec
Guillemouze 1015 Messages postés samedi 25 octobre 2003Date d'inscription 29 août 2013 Dernière intervention - 27 sept. 2012 à 14:05
0
Merci
Voila un document qui m'a l'air très intéressant Cari.
Merci pour le lien
Commenter la réponse de Guillemouze
sp40 1293 Messages postés mardi 28 octobre 2003Date d'inscriptionContributeurStatut 3 juillet 2015 Dernière intervention - 27 sept. 2012 à 14:24
0
Merci
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
Commenter la réponse de sp40
sp40 1293 Messages postés mardi 28 octobre 2003Date d'inscriptionContributeurStatut 3 juillet 2015 Dernière intervention - 29 sept. 2012 à 09:00
0
Merci
Ok Cirec, bien noté. Merci pour ce complément d'information.

Simon
Commenter la réponse de sp40

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.