AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

System.PPWideChar (ja mit zwei P)

Ein Thema von QuickAndDirty · begonnen am 19. Mär 2025 · letzter Beitrag vom 19. Mär 2025
Antwort Antwort
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.991 Beiträge
 
Delphi 12 Athens
 
#1

System.PPWideChar (ja mit zwei P)

  Alt Heute, 16:07
Delphi-Version: 12 Athens
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?
Andreas
Monads? Wtf are Monads?

Geändert von QuickAndDirty (Heute um 16:13 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: System.PPWideChar (ja mit zwei P)

  Alt Heute, 16:29
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 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.
Pointer(MeinArray)

Wenn NIL als Listenabschluß, dann einfach einen Leerstring '' , als letzten Eintrag.

ACHTUNG, einen LeerStringm NICHT den Scheißtdreck namens 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.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (Heute um 16:32 Uhr)
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.991 Beiträge
 
Delphi 12 Athens
 
#3

AW: System.PPWideChar (ja mit zwei P)

  Alt Heute, 16:59
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;
Andreas
Monads? Wtf are Monads?

Geändert von QuickAndDirty (Heute um 17:05 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 20:55 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