![]() |
PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?
In einem anderen Thema wurde darüber diskutiert, ob man lieber LPARAM() oder Integer() nutzt als letzten Parameter bei SendMessage.
Es wurde aber angedeutet, dass LPARAM richtig sei. Ich frage mich jetzt aber: was ist wirklich richtig? Herr Puff (Moderator hier im Forum) hat damals selber Integer() genutzt. ![]() Außerdem: PChar, PAnsiChar, PWideChar? Was wann? Im oben genannten beispiel steht
Delphi-Quellcode:
. Partname ist ein string. Ist das heute noch richtig (Delphi 10 Starter)
Integer(PChar(
Dazu lese ich im Netz Zitat:
|
AW: PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?
Lese doch meinen vorherigen Post.
LPARAM ist Integer unter 32BIT warum jetzt dafür einen neuen Thread aufmachen?
Delphi-Quellcode:
PChar wird automatisch nach PWideChar gekastet kann aber nicht sagen ab welcher Delphi Version.
LPARAM = INT_PTR;
INT_PTR = Integer; Ich gehe immer danach wenn keine Warnung oder Fehler seitens des Compiler kommt dann ist es schon richtig. gruss |
AW: PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?
Zu
Delphi-Quellcode:
ist alles gesagt. Im Grunde IMMER den korrekten Typen aus dem Funktionsprototyp verwenden, dann ist man auf der sicheren Seite.
LPARAM
Delphi-Quellcode:
bei Unicode Delphi Versionen und
PChar = PWideChar
Delphi-Quellcode:
bei älteren nicht-Unicode Delphi Versionen. Referenzzählung hast du hier in keinem Falle.
PChar = PAnsiChar
Zitat:
Delphi-Quellcode:
verwenden sollst.
String
|
AW: PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?
Zitat:
Zitat:
Gilt das für alles wo Wide und Ansi drin steht? Zitat:
|
AW: PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?
Zitat:
Damit du wenn du portierst das nicht alles von Hand selbst erledigen musst. Hatte ich doch geschrieben. Zitat:
gruss |
AW: PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?
Zitat:
Delphi-Quellcode:
bzw.
PWideChar
Delphi-Quellcode:
aber tatsächlich nur dann empfehlen, wenn du eine Funktion oder API hast, die ebenfalls diesen expliziten Typen erwartet.
PAnsiChar
Delphi definiert bei WinAPIs auch in der Regel z.b.
Delphi-Quellcode:
,
MessageBoxA
Delphi-Quellcode:
und dann einmal noch nur
MessageBoxW
Delphi-Quellcode:
, welches dann auf eine der beiden Varianten verweist. Dadurch brauchst du dir über A/W keine Gedanken machen und einfach
MessageBox
Delphi-Quellcode:
aufrufen. Willst du in irgendeinem Falle mal eine explizite Version, dann solltest du auch den Typen in die explizite Form casten:
MessageBox(PChar(), ...)
Delphi-Quellcode:
.
MessageBoxA(PAnsiChar(), ...)
|
AW: PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?
Zitat:
Ich hab hier zum Beispiel
Delphi-Quellcode:
.
:= GetFileAttributes(PWideChar(
Erwartet wird hier tatsächlich Winapi.Windows.LPCWSTR. Hier besser als auf LPCWSTR casten? |
AW: PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?
Zitat:
z.B. FreePascal und Lazarus (die bekannteste IDE und GUI-Framework dafür) Da hat man sich zu großen Teilen für UTF-8 entschieden, als man auf Unicode umstellte, während Delphi sich an der WinAPI orientiert, also UTF-16 (seit WinXP) und UCS-2 (Win2K). Zitat:
Die Parameter von SendMessage sind Systemabhängig, also unter 64 Bit sind sie ebenfalls 64 Bit. DWORD ist immer nur 4 Byte. Integer/Cardinal waren mal Systemtypen > in Windows 3.1 16 Bit waren sie ebenfalls 16 Bit, aber bei der Entwiclung zu 64 Bit hatten sich die großen Entscheider entschiden den Integer einzufrieren und einen neuen Typ zu erfinden. In Delphi nennen sie sich ![]() ![]() Vergleichbar Char, PChar und String, welche sich anpassen. AnsiString, AnsiChar PAnsiChar usw. sind immer fest definiert. Passend zu diesen Typen gibt es auch sich selbt anpassende Funktionen. z.B. CreateFile (PChar) und CreateFileA (PAnsiChar) oder CreateFileW (PWideChar). Vorallem in der WinAPI hat eine API-Funktion auch genau eine Parameterdefinition, je Systemkonfiguration (ANSI/Unicode + 32/64 Bit). Es gibt die beiden ANSI- und Unicode-Versionen und einen Alias, der auf das aktuell hauptsächlich unterstützte System verweist. Also erstmal kommt die Entscheidung ob der geschriebene Code statisch oder dynamisch ist. > ist er immer nur ANSI oder Unicode (bzw. 32 oder 64 Bit) > oder passt er sich ans System an Dementsprechend muß man dann auch die passenden Typen und Funktionen verwenden (statisch oder dynamisch). Bei der Vermischung von statisch und dynamisch kommt es zu problemen, wenn das System sich ändert, da sich dann ein Teil ans system anpasst und der Andere bleibt unverändert. |
AW: PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?
Statisch? Dynamisch? Jetzt bin ich voll hinterm Berg. Ich bin ein ganz normaler Noob der Delphi privat nutzt.
Habe eben einfach alle PChar durch PWideChar ausgetauscht. Das war nämlich auch was, was die Funktionen alle erwartet haben. PChar ist wie ich verstanden habe zwar auch PWideChar, aber ich nehme lieber PWideChar da ich eh nicht auf ein älteres Delphi zurück gehe. |
AW: PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?
Zitat:
gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:28 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-2025 by Thomas Breitkreuz