AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?
Thema durchsuchen
Ansicht
Themen-Optionen

PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?

Ein Thema von Glados · begonnen am 4. Nov 2017 · letzter Beitrag vom 5. Nov 2017
Antwort Antwort
Seite 1 von 3  1 23      
Glados
(Gast)

n/a Beiträge
 
#1

PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?

  Alt 4. Nov 2017, 18:36
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.
http://www.delphipraxis.net/110825-f...n-dateien.html

Außerdem: PChar, PAnsiChar, PWideChar? Was wann?
Im oben genannten beispiel steht Integer(PChar( . Partname ist ein string. Ist das heute noch richtig (Delphi 10 Starter)

Dazu lese ich im Netz
Zitat:
Hinweis: PChar ist unsicher, wenn er in Kombination mit normalen string-Werten verwendet wird. PChar unterliegt nicht der Referenzzählung und wird beim Zuweisen nicht kopiert ("Copy-On-Written-Semantik"). Dies kann zur Beschädigung der string-Werte oder zu Speicherlecks führen.
Implizieren die damit, dass man PWideChar nehmen soll?

Geändert von Glados ( 4. Nov 2017 um 18:39 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?

  Alt 4. Nov 2017, 18:44
Lese doch meinen vorherigen Post.
LPARAM ist Integer unter 32BIT warum jetzt dafür einen neuen Thread aufmachen?

Delphi-Quellcode:
LPARAM = INT_PTR;
INT_PTR = Integer;
PChar wird automatisch nach PWideChar gekastet kann aber nicht sagen ab welcher Delphi Version.

Ich gehe immer danach wenn keine Warnung oder Fehler seitens des Compiler kommt dann ist es schon richtig.

gruss

Geändert von EWeiss ( 4. Nov 2017 um 18:47 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

AW: PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?

  Alt 4. Nov 2017, 18:48
Zu LPARAM ist alles gesagt. Im Grunde IMMER den korrekten Typen aus dem Funktionsprototyp verwenden, dann ist man auf der sicheren Seite.

PChar = PWideChar bei Unicode Delphi Versionen und PChar = PAnsiChar bei älteren nicht-Unicode Delphi Versionen. Referenzzählung hast du hier in keinem Falle.

Implizieren die damit, dass man PWideChar nehmen soll?
Eher, dass du String verwenden sollst.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Glados
(Gast)

n/a Beiträge
 
#4

AW: PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?

  Alt 4. Nov 2017, 18:48
Zitat:
PChar wird automatisch nach PWideChar
Heißt das ich kann ohne Probleme alle PChar durch PWideChar ersetzen?

Zitat:
PChar = PWideChar bei Unicode Delphi Versionen und PChar = PAnsiChar bei älteren nicht-Unicode Delphi Versionen.
Diese Information war gut.
Gilt das für alles wo Wide und Ansi drin steht?

Zitat:
Referenzzählung hast du hier in keinem Falle.
Kenne ich nicht, brauche ich nicht
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?

  Alt 4. Nov 2017, 18:51
Zitat:
PChar wird automatisch nach PWideChar
Heißt das ich kann ohne Probleme alle PChar durch PWideChar ersetzen?

Zitat:
PChar = PWideChar bei Unicode Delphi Versionen und PChar = PAnsiChar bei älteren nicht-Unicode Delphi Versionen.
Diese Information war gut.
Gilt das für alles wo Wide und Ansi drin steht?

Zitat:
Referenzzählung hast du hier in keinem Falle.
Kenne ich nicht, brauche ich nicht
Das macht Delphi selbst der Einfachheit halber.
Damit du wenn du portierst das nicht alles von Hand selbst erledigen musst.

Hatte ich doch geschrieben.

Zitat:
Eher, dass du String verwenden sollst.
Ist mir neu den viele Funktionen erwarten nun mal PWideChar und nicht string.


gruss
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#6

AW: PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?

  Alt 4. Nov 2017, 18:52
Zitat:
PChar wird automatisch nach PWideChar
Heißt das ich kann ohne Probleme alle PChar durch PWideChar ersetzen?
Wenn du sicher bist, dass dein Code nie auf einer Ansi-Version von Delphi kompiliert werden wird, ja. Würde die explizite Verwendung von PWideChar bzw. PAnsiChar aber tatsächlich nur dann empfehlen, wenn du eine Funktion oder API hast, die ebenfalls diesen expliziten Typen erwartet.

Delphi definiert bei WinAPIs auch in der Regel z.b. MessageBoxA , MessageBoxW und dann einmal noch nur MessageBox , welches dann auf eine der beiden Varianten verweist. Dadurch brauchst du dir über A/W keine Gedanken machen und einfach MessageBox(PChar(), ...) aufrufen. Willst du in irgendeinem Falle mal eine explizite Version, dann solltest du auch den Typen in die explizite Form casten: MessageBoxA(PAnsiChar(), ...) .
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Glados
(Gast)

n/a Beiträge
 
#7

AW: PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?

  Alt 4. Nov 2017, 18:55
Zitat:
Wenn du sicher bist, dass dein Code nie auf einer Ansi-Version von Delphi kompiliert werden wird, ja
Warum sollte man eine 10 jahre alte Delphi-Version verwenden?

Ich hab hier zum Beispiel := GetFileAttributes(PWideChar( .
Erwartet wird hier tatsächlich Winapi.Windows.LPCWSTR. Hier besser als auf LPCWSTR casten?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?

  Alt 4. Nov 2017, 20:51
Zitat:
Warum sollte man eine 10 jahre alte Delphi-Version verwenden?
Weil es nicht nur Delphi gibt?

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).

Habe selbe Zeile auch schon mit DWORD gesehen.
Hier wird u.a. auch Integer verwendet http://www.cryer.co.uk/brian/delphi/...eforfolder.htm
DWORD ist noch falscher, als Integer.

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 Delphi-Referenz durchsuchenNativeInt und Delphi-Referenz durchsuchenNativeUInt.

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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 5. Nov 2017 um 15:06 Uhr)
  Mit Zitat antworten Zitat
Glados
(Gast)

n/a Beiträge
 
#9

AW: PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?

  Alt 4. Nov 2017, 20:57
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.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#10

AW: PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?

  Alt 4. Nov 2017, 21:02
Zitat:
aber ich nehme lieber PWideChar da ich eh nicht auf ein älteres Delphi zurück gehe.
Da machste nix falsch.


gruss
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 11:56 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