Registriert seit: 14. Jul 2003
Ort: Flintbek
810 Beiträge
Delphi XE2 Professional
|
IsHostAlive mit XE2 - Unklare Fehler / Warnungen
12. Mär 2014, 10:34
Moin zusammen,
ich verwende aus der CodeLibrary die IsHostAlive Unit, welche ich sehr gerne benutze. Ich musste aber die Umwandlung der Strings in PAnsiString anpassen und verwende dafür eine Funktion. Habe ich im Netz gefunden. Vielleicht geht es ja einfacher.
Delphi-Quellcode:
unit uHostAlive;
...
function StringToPAnsiChar(stringVar : string) : PAnsiChar;
Var
AnsString : AnsiString;
InternalError : Boolean;
begin
InternalError := false;
Result := ' ';
try
if stringVar <> ' ' Then
begin
AnsString := AnsiString(StringVar);
Result := PAnsiChar(PAnsiString(AnsString));
end;
Except
InternalError := true;
end;
end;
function IsHostAlive(Hostname: String; pTripTime: PCardinal = nil; Timeout: Integer = 5000; TTL: Integer = 255): Boolean;
const
SendBuffer: array[0..31] of char =
(' p', ' i', ' n', ' g', ' p', ' o', ' n', ' g',
' p', ' i', ' n', ' g', ' p', ' o', ' n', ' g',
' p', ' i', ' n', ' g', ' p', ' o', ' n', ' g',
' p', ' i', ' n', ' g', ' p', ' o', ' n', ' g');
var
WSA: TWSADATA;
Reply: PICMP_ECHO_REPLY;
Addr: Integer;
hIcmp: cardinal;
Options: IP_OPTION_INFORMATION;
function ResolveHost(Hostname: String): Integer;
type
PPInAddr= ^PInAddr;
var
HostInfo: PHostEnt;
T: PPInAddr;
begin
t:= nil;
Result:= inet_addr(PAnsiChar(Hostname)); // mit XE2 ging PChar nicht mehr aber PAnsiChar
if result = INADDR_NONE then begin
HostInfo:= gethostbyname(StringToPAnsiChar(Hostname)); // mit XE2 ging PChar und PAnsiChar nicht mehr, deshalb die Funktion
if HostInfo <> nil then
T:= Pointer(HostInfo^.h_addr_list);
if (T <> nil) and (T^<> nil) then begin
Result:= T^^.S_addr;
end;
end;
end;
begin
Result:= False;
FillChar(Options, sizeof(IP_OPTION_INFORMATION), #0);
Reply:= nil;
options.TTL:= TTL;
options.TOS:= 1;
if WSAStartUp(((0 shl 8)+2), WSA) = 0 then begin
Addr:= ResolveHost(Hostname);
if Addr <> INADDR_NONE then begin
hIcmp:= IcmpCreateFile();
if hicmp <> INVALID_HANDLE_VALUE then try
Reply:= AllocMem(sizeof(ICMP_ECHO_REPLY)+sizeof(SendBuffer));
IcmpSendEcho(hIcmp, Addr, @SendBuffer[0], sizeof(SendBuffer), @Options, Reply, sizeof(ICMP_ECHO_REPLY)+sizeof(SendBuffer), timeout);
Result:= (Reply^.Status = 0);
if Result and (pTripTime <> nil) then
pTripTime^:= Reply^.RoundTripTime;
finally
IcmpCloseHandle(hIcmp);
if Reply <> nil then
FreeMem(Reply);
WSACleanup();
end;
end else begin
WSACleanup();
// Hostname konnte nicht aufgelöst werden.
end;
end else begin
// Winsock konnte nicht gestartet werden.
end;
end;
end.
Leider macht mir die Unit seit der Umstellung auf XE2 Pro Ärger und meine Computer und Server sind nie erreichbar.
Die Vergleiche sind immer gleich (True oder False) laut Compilier.
Delphi-Quellcode:
if result = INADDR_NONE then begin // [DCC Warnung] uHostAlive.pas(79): W1021 Der Vergleich ergibt immer False
// [DCC Warnung] uHostAlive.pas(79): W1023 Vorzeichenbehaftete und -lose Typen werden verglichen - beide Operanden werden erweitert
...
Addr:= ResolveHost(Hostname);
if Addr <> INADDR_NONE then begin // [DCC Warnung] uHostAlive.pas(97): W1022 Der Vergleich ergibt immer True
// [DCC Warnung] uHostAlive.pas(97): W1023 Vorzeichenbehaftete und -lose Typen werden verglichen - beide Operanden werden erweitert
Wie gesagt, die Probleme hatte ich mit meiner früheren Version TurboDelphi Pro nicht. Ich könnte die Warnungen ja ignorieren aber die Computer / Server sind laut Rückgabewert nie erreichbar und das stimmt nicht.
Ich hoffe, einer von euch geht die Probleme und einen Lösungsansatz. Würde ungern auf diese Unit verzichten.
Gruß Sven
|