Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi System.PPWideChar (ja mit zwei P) (https://www.delphipraxis.net/216900-system-ppwidechar-ja-mit-zwei-p.html)

QuickAndDirty 19. Mär 2025 15:07

Delphi-Version: 12 Athens

System.PPWideChar (ja mit zwei P)
 
Hallo
PPWideChar ist in der Unit System definiert als
Code:
 PPWideChar   = ^PWideChar;
Das sollen zwei Arrays von PWidechar Strings sein....
Delphi-Quellcode:
Var keys:PPWideChar := nil;
Var values:PPWideChar := nil;
Wie weise ich das denn da zu???


Das hier
Delphi-Quellcode:
//https://learn.microsoft.com/de-de/windows/win32/api/windns/ns-windns-dns_service_instance
//ich habe die record definition extra weggelassen! 

PWSTR *keys;
PWSTR *values;
wäre das Original in c++ oder c...

Sind das doppelnull terminierte C++ Strings mit mit jeweils nullterminierten elementen? (Enden Doppelnull terminierte string-arrays mit mindestens einem Eintrag auf 3 oder auf 2 nullen? )
Oder ist das noch mal ganz was anderes?

himitsu 19. Mär 2025 15:29

AW: System.PPWideChar (ja mit zwei P)
 
Grundsätzlich ist PPWideChar erstmal nicht anderes, als ein Zeiger auf einen Zeiger, auf einen StringInhalt, welcher mit #0 terminiert ist.

Wenn es ein Zeiger auf eine Liste von PWideChars sein soll, dann kommt es halt drauf an.
* ist dise Liste ebenfalls 0-terminiert, also mit einem NIL als letzten Eintrag
* ist die Länge vordefiniert
* oder wird die Länge extern weitergegeben (z.B. ein weiterer Count-Parameter)

Da die LongStrings (String, AnsiString, UnicodeString usw.) und auch WideString (SysAllocString) zur eigentlichen Längenangabe (Integer) implizit auch eine terminierende #0 enthalten,
sind die "lesend" kompatibel mit PChar/PAnsiChar/PWideChar und können direkt gecastet/genutzt werden.

Somit kannst zu auch einfach ein
Delphi-Quellcode:
var MeinArray: array of string;
nutzen (ab Delphi 2009), bzw. mit WideString oder UnicodeString,
und dann einfach nach PPWideChar oder Pointer casten und an den PPWideChar-Parameter übergeben.
Delphi-Quellcode:
Pointer(MeinArray)


Wenn NIL als Listenabschluß, dann einfach einen Leerstring
Delphi-Quellcode:
''
, als letzten Eintrag.

ACHTUNG, einen LeerStringm NICHT den Scheißtdreck namens
Delphi-Quellcode:
EmptyStr
, denn das ist kein NIL, sondern ein Zeiger auf #0.
ACHTUNG, auch PChar/PAnsiChar/PWideChar auf eine LeerString-Variable/Konstante gibt "EmptyStr" zurück. (PChar-Casts sind keine Casts, sondern böse CompilerMagic, welche auf _UStrToPWChar in der System.pas weiterleitet.
(EmptyStr ist auch noch eine beschissene Variable und keine Konstante)



PS: Es gibt auch noch C-Arrays, wo alle Strings in einem Speicher hintereinander liegen,
jeweils durch ein #0 getrennt und mit zwei #0#0 als Listenabschluß (quasi ein leerer String als Letztes).
z.B. die MultiString-Values in der Registry
Das ist auch der Grund, warum indizierte ENUMS in Delphi keine TypeInfo über ihre ElementNamen besitzen, da leere Strings in der Liste nicht möglich sind.

QuickAndDirty 19. Mär 2025 15:59

AW: System.PPWideChar (ja mit zwei P)
 
Ja es wird ein Count gespeichert. siehe dwPropertyCount

und der inhalt von keys ist beschrieben als
Code:
keys. Ein Zeiger auf ein Array von Zeichenfolgenwerten, die die Eigenschaftsschlüssel darstellen.
Ist das quasi ein Pointer auf ein Pointer array mit nullterminierten Strings? daher auch der dwPropertyCount weil das array ja unterschiedlich lang sein kann?

Quasi ein Äquivalent zu.
Delphi-Quellcode:
var dwPoropertyCount: uInt32;
var keys: array of PWidechar;
keys ist ja immer ein Zeiger auf ein Array oder muss es dann @keys[0] sein?

Sorry wenn ich gerade etwas durcheinander bin.

ist das alles das selbe?
Delphi-Quellcode:
var keys1: array of PWidechar;
var keys2: array [0..0] of PWidechar; // und dann malloc für array believiger größe
var keys3: Tarray<PWidechar>;
var Keys4: PPWideChar;


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:04 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