![]() |
String und PChar frage
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:
ein paar themen weiter hat himitsu das daraus gemacht:
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'; Zitat:
|
AW: String und PChar frage
Zitat:
|
AW: String und PChar frage
Zitat:
Verzeihung wenn ich nochmal nachfrage, mit Implementierung ist dann die API-Seite gemeint und nicht die Pascal-Seite? |
AW: String und PChar frage
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
Delphi-Quellcode:
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 (
Delphi-Quellcode:
bzw.
''#0#0
Delphi-Quellcode:
) und nicht auf NIL.
#0#0
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
Delphi-Quellcode:
statt
Pointer(S)
Delphi-Quellcode:
arbeiten.
PChar(S)
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. |
AW: String und PChar frage
Zitat:
Delphi-Quellcode:
für API-Calls wird ja in der Doku auch so beschrieben. Verwirrend ist lediglich die Deklaration der API-Funktion mit
PChar(S)
Delphi-Quellcode:
Parametern. Das weicht dann formal doch recht von der API-Dokumentation ab (obwohl es ja funktioniert).
const string
|
AW: String und PChar frage
Ja, es weicht ab, aber macht einem das Leben auch manchmal einfacher, weil man nicht immer manuell nach PChar casten muß.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:48 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