![]() |
Delphi-Version: 12 Athens
System.PPWideChar (ja mit zwei P)
Hallo
PPWideChar ist in der Unit System definiert als
Code:
Das sollen zwei Arrays von PWidechar Strings sein....
PPWideChar = ^PWideChar;
Delphi-Quellcode:
Wie weise ich das denn da zu???
Var keys:PPWideChar := nil;
Var values:PPWideChar := nil; Das hier
Delphi-Quellcode:
wäre das Original in c++ oder c...
//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; 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? |
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:
nutzen (ab Delphi 2009), bzw. mit WideString oder UnicodeString,
var MeinArray: array of string;
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:
, denn das ist kein NIL, sondern ein Zeiger auf #0.
EmptyStr
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. |
AW: System.PPWideChar (ja mit zwei P)
Ja es wird ein Count gespeichert.
![]() und der inhalt von keys ist beschrieben als
Code:
Ist das quasi ein Pointer auf ein Pointer array mit nullterminierten Strings? daher auch der dwPropertyCount weil das array ja unterschiedlich lang sein kann?
keys. Ein Zeiger auf ein Array von Zeichenfolgenwerten, die die Eigenschaftsschlüssel darstellen.
Quasi ein Äquivalent zu.
Delphi-Quellcode:
keys ist ja immer ein Zeiger auf ein Array oder muss es dann @keys[0] sein?
var dwPoropertyCount: uInt32;
var keys: array of PWidechar; 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