poonam
poonam

Reputation: 810

Delphi XE2 incompatible types pointer and PAnsiChar

I am compiling my application in Delphi XE2.It was developed in delphi 7.. My code is as follows:

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;

When i try to compile the code ,i get the following error: enter image description here

When i try this code in another application it works fine in Delphi 7. How do i convert from character pointer to PAnsiChar type to make it run on Delphi XE2??.

Upvotes: 2

Views: 11583

Answers (3)

Remy Lebeau
Remy Lebeau

Reputation: 595320

This is not the correct way to use gethostname(). Use this instead:

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;

Upvotes: 6

poonam
poonam

Reputation: 810

yes...i got it:) I declared HName as HName:PAnsiChar; and

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

Upvotes: 2

Simon Forsberg
Simon Forsberg

Reputation: 13331

My Delphi knowledge might be a little rusty, but as far as I remember:

PChar is (kind of like, not exactly) a pointer to a string in itself, so this type is actually an array of 101 PChars (strings):

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

I think you should change it to array [0..100] of Char, or why not declare HName as a PAnsiChar right from the start?

Upvotes: 6

Related Questions