Estoy implementando función Ping usando la API de windows en delphi xe3 desde aquí
(http://delphi.about.com/od/internetintranet/l/aa081503a.htm).

Estoy teniendo problema con la siguiente función.Se muestra el error de tipo incompatible Pansichar y Pwidechar.He sustituido Pchar con PAnsichar ahora se muestra excepción
‘Error al obtener la IP de Host’.

Estoy probando con localhost.

Por favor la guía de cuál es la correcta conversión.

const ADP_IP = '127.0.0.1';

procedure TranslateStringToTInAddr(AIP: string; var AInAddr);
var
  phe: PHostEnt;
  pac: PChar;
  GInitData: TWSAData;
begin
  WSAStartup($101, GInitData);
  try
    phe := GetHostByName(PChar(AIP));
    if Assigned(phe) then
    begin
      pac := phe^.h_addr_list^;
      if Assigned(pac) then
      begin
        with TIPAddr(AInAddr).S_un_b do begin
          s_b1 := Byte(pac[0]);
          s_b2 := Byte(pac[1]);
          s_b3 := Byte(pac[2]);
          s_b4 := Byte(pac[3]);
        end;
      end
      else
      begin
        raise Exception.Create('Error getting IP from HostName');
      end;
    end
    else
    begin
      raise Exception.Create('Error getting HostName');
    end;
  except
    FillChar(AInAddr, SizeOf(AInAddr), #0);
  end;
  WSACleanup;
end;
InformationsquelleAutor Xenon Xe | 2013-09-12

1 Comentario

  1. 4

    Usted no desea convertir de PAnsiChar a PWideChar. En su Unicode Delphi su PChar mapas para PWideChar. Pero gethostbyname recibe PAnsiChar. Usted necesita para convertir de Unicode a ANSI.

    Código como este:

    phe := gethostbyname(PAnsiChar(AnsiString(AIP)));

    En otras palabras, convertir la cadena a AnsiString y, a continuación, el reparto de la PAnsiChar. Personalmente me gustaría declarar la AIP parámetro a ser AnsiString.

    procedure TranslateStringToTInAddr(const AIP: AnsiString; var AInAddr);

    Y, a continuación, escribir la llamada a la gethostbyname así:

    phe := gethostbyname(PAnsiChar(AIP));

    Que tipo var parámetro es dudoso para mí. No veo ninguna razón de peso para su uso. Lo que está mal con declarando ser de tipo TIPAddr? Su FillChar es algo dudosa. ¿Cómo puede usted utilizar SizeOf en un tipo de parámetro?

    • gracias @David , yo lo hice ur manera .ahora lo que no se muestra ningún error, pero no hay mensaje que se muestra .acabo de tomar el código del sitio y trató de compilar ,yo no soy mucho más familiarizado con la api de windows. así que, no sé por qué su mejor uso var AIPaddr o algo más.
    • El código no los mensajes de la pantalla. De todos modos, mi respuesta le dice que lo que estaba mal con su llamada a gethostbyname. El código en mi respuesta hace correctamente. Por favor, no me esperaba para depurar el resto de su programa. He respondido a la pregunta que usted pidió. Que es como funciona ASÍ.
    • No me refería a que he implementado todo el código que se indican en el enlace que he pegado y pantallas de mensaje.delphi.about.com/od/internetintranet/l/aa081503a.htm .Muchas gracias por tu ayuda, sí lo hizo eliminado el error.
    • por mensaje entiendo lo que dices de que no son las excepciones planteadas, así que lo que están diciendo es que el gethostbyname() función ha funcionado correctamente. Sin embargo, estoy de acuerdo con @David que el var parámetro debe ser escrito como TIpAddr, ya que el código depende de que funcione. El FillChar en el último bloque de excepción es misteriosa para mí. Podría usted explicar esto?
    • El código fue copiado por el artículo vinculado, que es dudoso para mí. Su conjetura es tan buena como la mía.
    • No me puedo explicar porque no es mi código. necesito una función ping y trató de esta función de windows. i m a mí mismo tratando de entender el código. necesito un poco de ayuda aquí.debería de implementar a mí mismo, o el uso de la api de windows?
    • Creo que debería publicar una nueva pregunta para esta guía .Muchas gracias a todos .

Dejar respuesta

Please enter your comment!
Please enter your name here