AGB  ·  Datenschutz  ·  Impressum  







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

String und PChar frage

Ein Thema von KodeZwerg · begonnen am 21. Aug 2022 · letzter Beitrag vom 21. Aug 2022
Antwort Antwort
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#1

String und PChar frage

  Alt 21. Aug 2022, 10:51
Ich war auf der Suche nach einem Dialog der sich selbst schließen kann und bin hier im Forum auf das gestoßen:
Delphi-Quellcode:
const
  MB_TIMEDOUT = 32000;

function MessageBoxTimeOut(hWnd: HWND; lpText: PChar; lpCaption: PChar; uType: UINT; wLanguageId: WORD; dwMilliseconds: DWORD): Integer; stdcall; external user32 name {$IFDEF UNICODE}'MessageBoxTimeoutW'{$ELSE}'MessageBoxTimeoutA'{$ENDIF};
function MessageBoxTimeOutA(hWnd: HWND; lpText: PAnsiChar; lpCaption: PAnsiChar; uType: UINT; wLanguageId: WORD; dwMilliseconds: DWORD): Integer; stdcall; external user32 name 'MessageBoxTimeoutA';
function MessageBoxTimeOutW(hWnd: HWND; lpText: PWideChar; lpCaption: PWideChar; uType: UINT; wLanguageId: WORD; dwMilliseconds: DWORD): Integer; stdcall; external user32 name 'MessageBoxTimeoutW';
ein paar themen weiter hat himitsu das daraus gemacht:
Delphi-Quellcode:
const LibLang = {$IFDEF UNICODE}'W'{$ELSE}'A'{$ENDIF}; // wenn man das öfters mal braucht
function MessageBoxTimeOut(OwnerWindow: HWND; const Text, Caption: string;
  MType: LongWord; LanguageID: Word; Milliseconds: LongWord): Integer; stdcall;
  external user32 name 'MessageBoxTimeout' + LibLang;
function MessageBoxTimeOutA(OwnerWindow: HWND; const Text, Caption: AnsiString;
  MType: LongWord; LanguageID: Word; Milliseconds: LongWord): Integer; stdcall;
  external user32;
function MessageBoxTimeOutW(OwnerWindow: HWND; const Text, Caption: {$IFDEF UNICODE}UnicodeString{$ELSE}WideString{$ENDIF};
  MType: LongWord; LanguageID: Word; Milliseconds: LongWord): Integer; stdcall;
  external user32;
Ich frage mich an dieser Stelle warum es funktioniert das ein PChar mit einem string ausgetauscht werden kann.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
701 Beiträge
 
Delphi 12 Athens
 
#2

AW: String und PChar frage

  Alt 21. Aug 2022, 12:24
Ich war auf der Suche nach einem Dialog der sich selbst schließen kann und bin hier im Forum auf das gestoßen:
[DELPHI]

Ich frage mich an dieser Stelle warum es funktioniert das ein PChar mit einem string ausgetauscht werden kann.
Sowas ist generell eine schlechte Idee, weil es von der Art der Implementierung des verwendeten String-Typen und des Mechanismus zur Parameterübergabe abhängig ist. Es funktioniert hier weil eine Variable vom Typ String einen Pointer enthält, der auf das erste Zeichen im String zeigt und die Implementierung auch dafür sorgt, dass der Text mit #0 abgeschlossen wird.
Peter Below
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: String und PChar frage

  Alt 21. Aug 2022, 13:08
... und die Implementierung auch dafür sorgt, dass der Text mit #0 abgeschlossen wird.
Vielen Dank für Deine Antwort peterbelow,
Verzeihung wenn ich nochmal nachfrage, mit Implementierung ist dann die API-Seite gemeint und nicht die Pascal-Seite?
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: String und PChar frage

  Alt 21. Aug 2022, 13:42
Der Delphi-String (die LongStrings) ist intern so gebaut, dass es kompatibel zum PChar ist.
Er arbeitet zwar mit einem Längenbyte (Integer), aber hat dennoch zusätzlich auch noch zwei #0 hinter dem String-Ende liegen, weswegen sich String direkt nach PChar casten lässt.

Also ja, man könnte solche Parameter tauschen, aber nur für Lesezugriffe.


Achtung, PChar als Parameter-Typ hat bei einem Leerstring teilweise ein Problem,
denn wenn man einen Parameter nicht übergeben will, dann wird oft NIL verlangt,
aber der PChar-Cast im Delphi hat eine Besonderheit.

Bei einem Leerstring '' ist der String im Delphi zwar NIL,
aber der Cast gibt in diesem Fall nicht das NIL raus, sondern den Zeiger auf eine "existierende" Stringkonstante mit leerem Text, also auf zwei #0 (''#0#0 bzw. #0#0 ) und nicht auf NIL.


In diesem Fall würde der umgeschriebene Parameter auf String eventuell das "oft" (nicht immer) bessere Ergebnis liefern.
Ebenso kann man bei einem Cast von String auf PChar mit Pointer(S) statt PChar(S) arbeiten.

Bei Pointer muß man aber aufpassen, dass mn nicht PChar/PAnsiChar/PWideChar verwechselt, weil der Compiler dort keine Typprüfung machen kann, mit der bekannten Warnung.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (21. Aug 2022 um 13:49 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#5

AW: String und PChar frage

  Alt 21. Aug 2022, 13:47
weswegen sich String direkt nach PChar casten lässt.
Das PChar(S) für API-Calls wird ja in der Doku auch so beschrieben. Verwirrend ist lediglich die Deklaration der API-Funktion mit const string Parametern. Das weicht dann formal doch recht von der API-Dokumentation ab (obwohl es ja funktioniert).
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: String und PChar frage

  Alt 21. Aug 2022, 14:27
Ja, es weicht ab, aber macht einem das Leben auch manchmal einfacher, weil man nicht immer manuell nach PChar casten muß.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  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 16:20 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