2012-06-06 5 views
2

Je compile ma demande dans Delphi XE2 .Il a été développé dans delphi 7.. Mon code est le suivant:Delphi XE2 pointeur types incompatibles et PAnsiChar

type 
Name = array[0..100] of PChar; 
PName = ^Name; 
var 
    HEnt: pHostEnt; 
    HName: PName; 
    WSAData: TWSAData; 
    i: Integer; 

begin 
    Result := False; 
    if WSAStartup($0101, WSAData) <> 0 then begin 
    WSAErr := 'Winsock is not responding."'; 
     Exit; 
    end; 
    IPaddr := ''; 
    New(HName); 


if GetHostName(HName^, SizeOf(Name)) = 0 then <-----ERROR 
    begin 
     HostName := StrPas(HName^);  

     HEnt := GetHostByName(HName^);  
      " 
      " 
     so on... 
    end; 

Quand je tente de compiler le code, je reçois l'erreur suivante: enter image description here

Quand j'essaye ce code dans une autre application, il fonctionne très bien dans Delphi 7. Comment puis-je convertir du pointeur de caractère en type PAnsiChar pour le faire fonctionner sur Delphi XE2 ??.

+0

Sur quelle ligne l'erreur se produit-elle? –

+0

Je l'ai marqué comme erreur juste maintenant ... – poonam

Répondre

5

Mes connaissances Delphi pourrait être un peu rouillé, mais pour autant que je me souviens:

PChar est (un peu comme, pas exactement) un pointeur sur une chaîne en elle-même, de sorte que ce type est en fait un tableau de 101 PChars (cordes):

Name = array[0..100] of PChar;

Je pense que vous devriez changer pour array [0..100] of Char, ou pourquoi ne pas déclarer HName comme PAnsiChar dès le départ?

+0

Si je le déclare comme tableau de char alors il donne la même erreur. et si HName est déclaré comme PAnsiChar alors il dit "Types Incompatibles: PAnsiChar et AnsiChar". – poonam

2

oui ... je l'ai eu :) J'ai déclaré HName comme HName: PAnsiChar; et

if GetHostName(PAnsiChar(HName^), SizeOf(Name)) = 0 
HostName := StrPas(PAnsiChar(HName^)); 
HEnt := GetHostByName(PAnsiChar(HName^));  
5

Ce n'est pas la bonne façon d'utiliser gethostname(). Utilisez ceci à la place:

var 
    HName: array[0..100] of AnsiChar; 
    HEnt: pHostEnt; 
    WSAData: TWSAData; 
    i: Integer; 
begin 
    Result := False; 
    if WSAStartup($0101, WSAData) <> 0 then begin 
    WSAErr := 'Winsock is not responding."'; 
    Exit; 
    end; 
    IPaddr := ''; 

    if gethostname(HName, SizeOf(Name)) = 0 then 
    begin 
    HostName := StrPas(HName); 
    HEnt := gethostbyname(HName); 
    ... 
    end; 
    ... 
end; 
+1

ohh ok ... j'ai fait les changements ... merci beaucoup :) – poonam