Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   PAnsiChar und PWidechar (https://www.delphipraxis.net/185107-pansichar-und-pwidechar.html)

codenoob 15. Mai 2015 16:24

PAnsiChar und PWidechar
 
Hi Delphianer's

Ich habe ein codeschnipsel gefunden das sich mit multitreaded sockets befasst.
Sihe unten stehenden code.

Delphi-Quellcode:
function ResolveAddress(Address: String): TInAddr;

implementation

var WSAData: TWSAData;

function ResolveAddress(Address: String): TInAddr;
var
  Host: PHostEnt;
begin
  Result.S_addr := inet_addr(PChar(Address));
  if Result.S_addr = INADDR_NONE then
  begin
    Host := gethostbyname(PChar(Address));
    if Host <> nil then
      Result := PInAddr(Host.h_addr_list^)^;
  end;
end;
Leider bekomme ich vom Compiuler Fehlermeldungen "Inkompatible Typen : 'PAnsiChar' und PWideChar'

wenn ich dann im Code die Zeile
Delphi-Quellcode:
  Result.S_addr := inet_addr(PChar(Address));
und die Zeile

Delphi-Quellcode:
   Host := gethostbyname(PChar(Address));
so umändere

Delphi-Quellcode:
  Result.S_addr := inet_addr('127.0.0.1');
und die Zeile

Delphi-Quellcode:
   Host := gethostbyname('127.0.0.1');
dann funktioniert es.
Was muss ich da genau ändern damit es wieder mit dem String Adress funktioniert?

himitsu 15. Mai 2015 17:00

AW: PAnsiChar und PWidechar
 
Wenn inet_addr einen PAnsiChar haben will, dann mußt du ihm das auch geben.
AnsiString + PAnsiChar

Bei direkter Übergabe von Konstanten ala '127.0.0.1' nimmt Delphi automatisch eine Konvertierung vor, also bei PWideChar wird der String als Unicode übergeben und bei PAnsiChar als ANSI.


Man kann maximal noch nachsehen, ob inet_addr immer nur PAnsiChar haben will, oder ob es davon auch eine Unicode-Version gibt ... Genaueres immer siehe Definition im MSDN.



PS: Du hast in der Enterprise absichtlich die Quellcodes dabei, somit kann man also immer nachsehn, was die Funktion wirklich haben will,
denn im Code-Insight kann man nicht zwischen PChar und PWideChar (seit Delphi 2009) oder PChar und PAnsiChar (bis Delphi 2007) unterscheiden.

PChar ist ein compilerabhängiger Typ Alias für PWideChar oder PAnsiChar.
Und bei alten oder schrottigen aktuellen Codes muß man immer beachten, daß viele Programmierer nicht auf den korrekten Typen achten und z.B. PChar benutzt haben, obwohl es eigentlich explizit PAnsiChar hätte sein sollen, was dann seit D2009 probleme bereitet.

codenoob 15. Mai 2015 18:14

AW: PAnsiChar und PWidechar
 
Also die Zeile mit dem

Delphi-Quellcode:
   Host := gethostbyname(PChar(Address));


hab ich jetzt so mal umgeändert

Delphi-Quellcode:
   Host := gethostbyname(PAnsiChar(AnsiString(Address)));


und die funktioniert so weit jetzt auch und compiler meckert auch nicht mehr nicht mehr.

aber bei der Zeile

Delphi-Quellcode:
   Result.S_addr := inet_addr(PChar(Address));


funktioniert das so nicht?
Mach ich das noch was falsch oder hab ich da was übersehen?
Weil ich hab vorher für beide Zeilen den Fehler "Inkompatible Tyben : 'PwideChar und PAnsiChar'" bekommen folglich sollte die beiden Zeilen doch gleich umgeändert werden oder?


L.g Tom

codenoob 17. Mai 2015 01:18

AW: PAnsiChar und PWidechar
 
Kann mir denn da niemand helfen?

HolgerX 17. Mai 2015 07:38

AW: PAnsiChar und PWidechar
 
Müste es dann nicht auch
Code:
Result.S_addr := inet_addr(PAnsiChar(AnsiString(Address)));
heißen ?

unsigned long inet_addr(__in const char *cp);

https://msdn.microsoft.com/de-de/lib...=vs.85%29.aspx

char müsste AnsiChar sein :wink:

mkinzler 17. Mai 2015 16:54

AW: PAnsiChar und PWidechar
 
Deklariere Address besser gleich als AnsiString, dann entfällt das ganze Casten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:08 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz