Oppure

Loading
21/06/10 13:02
systemgvp
salve
da quando ho installa Delphi 2010 non riesco più a reperire il mio IP, prima usavo
questo codice con la libreria WinSock

function getIPs: Tstrings;
type
TaPInAddr = array[0..10] of PInAddr;
PaPInAddr = ^TaPInAddr;
var
phe: PHostEnt;
pptr: PaPInAddr;
Buffer: array[0..63] of Char;
I: Integer;
GInitData: TWSAData;
begin
WSAStartup(1, GInitData);
Result := TstringList.Create;
Result.Clear;
GetHostName(Buffer, SizeOf(Buffer));
phe := GetHostByName(buffer);
if phe = nil then Exit;
pPtr := PaPInAddr(phe^.h_addr_list);
I := 0;
while pPtr^[I] <> nil do
begin
Result.Add(inet_ntoa(pptr^[I]^));
Inc(I);
end;
WSACleanup;
end;

richiamato con

Memo1.Lines := GetIps;

ora mi porta un sacco di errori però con i formati delle variabili, come risolvo?
aaa
21/06/10 14:43
Irvine
ho trovato un mio progetto il delphi 2010, ho aperto solo l'exe e partiva, prova con questo codice utilizza anche questo winsock.

PS: non ricordo bene ma forse dava solo un problema tra array e pAnsi

// richiede un bottone ed una label nel form1, utilizza winsock, al click sul button1 nella label si ottiene l'ip

 

Function GetIPAddress():String;
type
  pu_long = ^u_long;
var
  varTWSAData : TWSAData;
  varPHostEnt : PHostEnt;
  varTInAddr : TInAddr;
  namebuf : Array[0..255] of char;
begin
  If WSAStartup(1,varTWSAData) <> 0 Then
  Result := 'No. IP Address'
  Else Begin
    gethostname(namebuf,sizeof(namebuf));
    varPHostEnt := gethostbyname(namebuf);
    varTInAddr.S_addr := u_long(pu_long(varPHostEnt^.h_addr_list^)^);
    Result := 'IP Address: '+inet_ntoa(varTInAddr);
  End;
  WSACleanup;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.Caption := GetIPAddress;
end;
 
end.

aaa
21/06/10 20:13
systemgvp
da questo errore

Checking project dependencies...
Compiling Project1.dproj (Debug configuration)
[DCC Error] Unit1.pas(39): E2010 Incompatible types: 'Array' and 'PAnsiChar'
[DCC Error] Unit1.pas(40): E2010 Incompatible types: 'Array' and 'PAnsiChar'
[DCC Fatal Error] Project1.dpr(5): F2063 Could not compile used unit 'Unit1.pas'
Failed
Elapsed time: 00:00:00.9

che oltretutto da anche col codice che usavo io e che da solo da Delphi 2010 come
se fosse stato aggiunta o modificata qualche tipo di variabile
aaa
21/06/10 20:28
Irvine
guarda per la fretta non ho copiato quello corretto ma solo il txt che avevo come promemoria, basta usare un array di ansichar al posto di char, funzionamento assicurato ;) quindi diventa cosi:

function GetIPAddress():string; 
type 
  pu_long = ^u_long; 
var 
  varTWSAData : TWSAData; 
  varPHostEnt : PHostEnt; 
  varTInAddr : TInAddr; 
  namebuf : array[0..255] of ansichar;    // qui dava il problema in quanto si usava l'array di char che non è compatibile con l'hostname
begin 
  if WSAStartup(1,varTWSAData) <> 0 then 
  Result := 'No. IP Address' 
  else begin 
    gethostname(namebuf,sizeof(namebuf)); 
    varPHostEnt := gethostbyname(namebuf); 
    varTInAddr.S_addr := u_long(pu_long(varPHostEnt^.h_addr_list^)^); 
    Result := 'IP Address: '+inet_ntoa(varTInAddr); 
  end; 
  WSACleanup; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
  Label1.Caption := GetIPAddress; 
end; 



PS: usa la mia e non modificare la tua che alla fine ti da anche problemi tra string e tstring ;)
Ultima modifica effettuata da Irvine 21/06/10 20:30
aaa
22/06/10 13:08
systemgvp
grazie, questo va alla grande
aaa
23/06/10 9:47
Saladino
L'altro codice non funzionva perchè in Delphi 2010 ,ed anche 2009 , il formato char è un'alias di widechar.
Cioè :
type
Char = WideChar
aaa
01/07/10 16:53
franz1994
il codice fornito da irvine mi fornisce solo l'ip locale, quello assegnatomi dal ruter e non quello vero e proprio. C'è un modo per ottenere quell'altro?
aaa
16/09/10 12:43
a_butta
function CleanIp(const S:String):String;
var
  newString: String;
  I: Integer;
begin
  for I := 1 to Length(S) do
    if not(ord(S[I]) in [10,13,32])  then
      newString:= newString + S[I];
  Result:= newString;
end;

function GetIpAddress:String;
var
  IpStrings: TStrings;
begin
  IpStrings:= TStringList.Create;
  if HttpGetText('http://hostering.altervista.org/myip.php',IpStrings) then
    begin
      Result:= CleanIp(IpStrings.Text);
    end
  else
    Result:= 'Error!';
end;


Costruita io usando la unit HTTPSend del pacchetto Synapse [Ararat] (ararat.cz/synapse/doku.php/…) e basandomi su un file php sul mio spazio altervista che genera l'indirizzo IP... Se desideri usare un qualsiasi altro server, basta sostituire l'indirizzo da cui si genera lo script per l'IP
aaa