AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

PAnsiChar und PWidechar

Ein Thema von codenoob · begonnen am 15. Mai 2015 · letzter Beitrag vom 17. Mai 2015
Antwort Antwort
codenoob
(Gast)

n/a Beiträge
 
#1

PAnsiChar und PWidechar

  Alt 15. Mai 2015, 16:24
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
  Result.S_addr := inet_addr(PChar(Address)); und die Zeile

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

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

   Host := gethostbyname('127.0.0.1'); dann funktioniert es.
Was muss ich da genau ändern damit es wieder mit dem String Adress funktioniert?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

AW: PAnsiChar und PWidechar

  Alt 15. Mai 2015, 17:00
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.
$2B or not $2B

Geändert von himitsu (15. Mai 2015 um 17:04 Uhr)
  Mit Zitat antworten Zitat
codenoob
(Gast)

n/a Beiträge
 
#3

AW: PAnsiChar und PWidechar

  Alt 15. Mai 2015, 18:14
Also die Zeile mit dem

   Host := gethostbyname(PChar(Address));

hab ich jetzt so mal umgeändert

   Host := gethostbyname(PAnsiChar(AnsiString(Address)));

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

aber bei der Zeile

   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
  Mit Zitat antworten Zitat
codenoob
(Gast)

n/a Beiträge
 
#4

AW: PAnsiChar und PWidechar

  Alt 17. Mai 2015, 01:18
Kann mir denn da niemand helfen?
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
972 Beiträge
 
Delphi 6 Professional
 
#5

AW: PAnsiChar und PWidechar

  Alt 17. Mai 2015, 07:38
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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: PAnsiChar und PWidechar

  Alt 17. Mai 2015, 16:54
Deklariere Address besser gleich als AnsiString, dann entfällt das ganze Casten.
Markus Kinzler
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:25 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz