Autor Téma: Poradite s unicode  (Přečteno 1034 krát)

Leo001

  • Host
Poradite s unicode
« kdy: 29-08-2012, 11:09:43 »
Zdravím.
Jsem takový ten domácí samouk ve stadiu lama   
Dostal jsem od kámoše zdrojak - Tacert
V nižších verzích delphi funguje.
V delphi XE2  ne.
Problém je ve funkci GetNameFromIP
Addr := inet_addr(PChar(IP));

a v proceduře  TTraceThread.Execute
Host := gethostbyname(PChar(DestinationAddress));

Pokud to ve funkci opravim takto
Addr := inet_addr( PAnsiChar(IP));

A v proceduře 
Host := gethostbyname(PAnsiChar(DestinationAddress));

Tak to delphi sežere ale program je nefunkční.
Kde dělam chybu.


Kód: Delphi [Vybrat]
  1.  function GetNameFromIP(const IP: String): String;
  2. const
  3.   ERR_INADDR    = 'Can not convert IP to in_addr.';
  4.   ERR_HOST      = 'Can not get host information.';
  5.   ERR_WSA       = 'Can not initialize WSA.';
  6. var
  7.   WSA   : TWSAData;
  8.   Host  : PHostEnt;
  9.   Addr  : u_long;
  10.   Err   : Integer;
  11. begin
  12.   Result := RES_UNKNOWN;
  13.   Err := WSAStartup(WSA_TYPE, WSA);
  14.   if Err <> 0 then
  15.   begin
  16.     {$IFNDEF NO_MESSAGE}
  17.       MessageDlg(ERR_WSA, mtError, [mbOK], 0);
  18.     {$ENDIF}
  19.     Exit;
  20.   end;
  21.   try
  22.     Addr := inet_addr(PChar(IP));
  23.     if Addr = u_long(INADDR_NONE) then
  24.     begin
  25.       {$IFNDEF NO_MESSAGE}
  26.         MessageDlg(ERR_INADDR, mtError, [mbOK], 0);
  27.       {$ENDIF}
  28.       Exit;
  29.     end;
  30.     Host := gethostbyaddr(@Addr, SizeOf(Addr), PF_INET);
  31.     if Assigned(Host) then
  32.       Result := Host.h_name
  33.     {$IFNDEF NO_MESSAGE}
  34.       else
  35.         MessageDlg(ERR_HOST, mtError, [mbOK], 0)
  36.     {$ENDIF}
  37.     ;
  38.   finally
  39.     WSACleanup;
  40.   end;
  41. end;
  42. [/quote]
  43.  
  44.  
  45. [code=delphi]
  46. procedure TTraceThread.Execute;
  47. var
  48.   WSAData: TWSAData;  
  49.   Host: PHostEnt;      
  50.   Error,              
  51.   TickStart: DWORD;    
  52.   Result: Longint;    
  53.   I,                  
  54.   Iteration: Byte;    
  55.   HostName: String;    
  56.   HostReply: Boolean;  
  57.   HostIP: LongInt;    
  58. begin
  59.   Error := WSAStartup(WSA_TYPE, WSAData);
  60.   if Error <> 0 then
  61.   begin
  62.     ReportString := SysErrorMessage(WSAGetLastError);
  63.     Synchronize(Log);
  64.     Exit;
  65.   end;
  66.  
  67.   try
  68.    
  69.     Host := gethostbyname(PChar(DestinationAddress));
  70.     if not Assigned(Host) then
  71.     begin
  72.       ReportString := SysErrorMessage(WSAGetLastError);
  73.       Synchronize(Log);
  74.       Exit;
  75.     end;
  76. [/quote]
  77.  
  78.  
  79.  
  80.  

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1429
  • Karma: 34
    • Pepak.net
Re:Poradite s unicode
« Odpověď #1 kdy: 29-08-2012, 11:31:11 »
Zdravím.
Jsem takový ten domácí samouk ve stadiu lama   
Dostal jsem od kámoše zdrojak - Tacert
V nižších verzích delphi funguje.
V delphi XE2  ne.
Problém je ve funkci GetNameFromIP
Addr := inet_addr(PChar(IP));
inet_addr existuje pouze v ANSI verzi. Tzn. musíš string přetypovat na AnsiString a ten potom na PAnsiChar:
Kód: Text [Vybrat]
  1. Addr := inet_addr(PAnsiChar(AnsiString(IP)));

Citace
a v proceduře  TTraceThread.Execute
Host := gethostbyname(PChar(DestinationAddress));
Stejný případ, existuje pouze ANSI verze.

Citace
Tak to delphi sežere ale program je nefunkční.
Kde dělam chybu.
Chybu děláš v tom, že na PAnsiChar přetypováváš (Wide)String, takže v ANSI vyjádření ta která procedura dostane jen první znak (pokud je v ASCII7) nebo smetí (pokud první znak není v ASCII7).