Ir al contenido


Foto

Hay algun problema de compatibilidad con PChar y PAnsiChar?


Mejor respuesta escafandra , 13 febrero 2017 - 10:22

Desde que Delphi adoptó el UNICODE no ha hecho otra cosa que liar las cosas y confundir los tipos.

 

El compilador pasa a interpretar PCHAR como PWCHAR. y lo que debe ser un verdadero PCHAR debe explicitarse como PAnsiCHAR.

 

 

El código que muestras pasaría a ser así para compilar en Berlin, por ejemplo.


delphi
  1. function GetIp(Host: string): string;
  2. var
  3. WSAData: TWSADATA;
  4. HostEnt: phostent;
  5. begin
  6. Result:= '';
  7. if WSAStartup(MAKEWORD(1, 1), WSADATA) = 0 then
  8. begin
  9. HostEnt:= gethostbyname(PAnsiChar(AnsiString(Host)));
  10. if HostEnt <> nil then
  11. Result:= inet_ntoa(PInAddr(HostEnt.h_addr_list^)^);
  12. WSACleanup;
  13. end;
  14. end;

Saludos.

Ir al mensaje completo


  • Por favor identifícate para responder
2 respuestas en este tema

#1 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 775 mensajes
  • LocationPinar del Río, Cuba

Escrito 13 febrero 2017 - 09:36

Hola a todos Pues sigo encontrando dificultades en mi soft de monitoreo de redes,

 

Una de ellas es en las funciones que usan PChar, el compilador me da el error de que PChar y PAnsiChar no son tipos compatibles y lo cambio por PAnsiChar, y no da mas el error, pero tampoco me devuelve nada la función.

 

Una de las situaciones es en el siguiente código para obtener el nombre de una PC dando la IP


delphi
  1. function GetIp(Host: string): string;
  2. var
  3. WSAData: TWSADATA;
  4. HostEnt: phostent;
  5. begin
  6. Result:= '';
  7. if WSAStartup(MAKEWORD(1, 1), WSADATA) = 0 then
  8. begin
  9. HostEnt:= gethostbyname(PChar(Host));
  10. if HostEnt <> nil then
  11. Result:= String(inet_ntoa(PInAddr(HostEnt.h_addr_list^)^));
  12. WSACleanup;
  13. end;
  14. end;

Asi me da el error comentado, y si lo cambio por PAnsiChar HostEnt devuelve nulo

 

Alguna idea de lo que sucede?

 

Como podre solucionar esto, para q la funcion me devuelva el nombre de la PC como es de esperar


Editado por JoAnCa, 13 febrero 2017 - 10:03 .

  • 0

#2 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.111 mensajes
  • LocationMadrid - España

Escrito 13 febrero 2017 - 10:22   Mejor respuesta

Desde que Delphi adoptó el UNICODE no ha hecho otra cosa que liar las cosas y confundir los tipos.

 

El compilador pasa a interpretar PCHAR como PWCHAR. y lo que debe ser un verdadero PCHAR debe explicitarse como PAnsiCHAR.

 

 

El código que muestras pasaría a ser así para compilar en Berlin, por ejemplo.


delphi
  1. function GetIp(Host: string): string;
  2. var
  3. WSAData: TWSADATA;
  4. HostEnt: phostent;
  5. begin
  6. Result:= '';
  7. if WSAStartup(MAKEWORD(1, 1), WSADATA) = 0 then
  8. begin
  9. HostEnt:= gethostbyname(PAnsiChar(AnsiString(Host)));
  10. if HostEnt <> nil then
  11. Result:= inet_ntoa(PInAddr(HostEnt.h_addr_list^)^);
  12. WSACleanup;
  13. end;
  14. end;

Saludos.


  • 2

#3 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 775 mensajes
  • LocationPinar del Río, Cuba

Escrito 13 febrero 2017 - 11:02

Desde que Delphi adoptó el UNICODE no ha hecho otra cosa que liar las cosas y confundir los tipos.

 

 

Y bien que si, que manera de complicarme por cuestion de los tipos. cosas que funcionaban antes ahora no :s

 

Pues cambiando el codigo como me dijiste, ahora funciona bien (y)


delphi
  1. //HostEnt:= gethostbyname(PChar(Host));
  2. HostEnt:= gethostbyname(PAnsiChar(AnsiString(Host)));

Muchas gracias

 

Tema Resuelto


  • 0




IP.Board spam blocked by CleanTalk.