Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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??.

like image 692
poonam Avatar asked Jun 09 '26 06:06

poonam


2 Answers

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?

like image 181
Simon Forsberg Avatar answered Jun 12 '26 11:06

Simon Forsberg


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;
like image 21
Remy Lebeau Avatar answered Jun 12 '26 12:06

Remy Lebeau