![]() |
PAnsiChar und PWidechar
Hi Delphianer's
Ich habe ein codeschnipsel gefunden das sich mit multitreaded sockets befasst. Sihe unten stehenden code.
Delphi-Quellcode:
Leider bekomme ich vom Compiuler Fehlermeldungen "Inkompatible Typen : 'PAnsiChar' und PWideChar'
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; wenn ich dann im Code die Zeile
Delphi-Quellcode:
und die Zeile
Result.S_addr := inet_addr(PChar(Address));
Delphi-Quellcode:
so umändere
Host := gethostbyname(PChar(Address));
Delphi-Quellcode:
und die Zeile
Result.S_addr := inet_addr('127.0.0.1');
Delphi-Quellcode:
dann funktioniert es.
Host := gethostbyname('127.0.0.1');
Was muss ich da genau ändern damit es wieder mit dem String Adress funktioniert? |
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. |
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 |
AW: PAnsiChar und PWidechar
Kann mir denn da niemand helfen?
|
AW: PAnsiChar und PWidechar
Müste es dann nicht auch
Code:
heißen ?
Result.S_addr := inet_addr(PAnsiChar(AnsiString(Address)));
unsigned long inet_addr(__in const char *cp); ![]() char müsste AnsiChar sein :wink: |
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