Nein, mit PChar auf einen veränderlichen String geht sowas
garnicht.
Delphi nutzt für das Result dieses IntToStr-Aufrufs (
PAnsiChar(IntToStr(I))
) die
selbe Variable, denn es ist in der Schleife auch der selbe Code
, also im nächsten Durchlauf sind somit die vorherigen Pointer
ungültig.
Selbes gilt in Schleifen für alle Funktionsaufrufe und Casts.
Und du kannst froh sein, dass hier der neue String im nächsten Durchlauf
zufällig auf der selben Speicheradresse gelandet ist, womit die alten PChar rein
zufällig wieder auf "diesen" String zeigten ... der neue String-Variableninhalt hätte aber auch genauso gut sonstwo landen können.
Man kann nun z.B. mit Sowas wie
NewStr arbeiten,
oder vor dem PChar/PAnsiChar muß der String irgendwo "sicher" gespeichert werden (RefCount größer 1)
z.B. durch eine "dauerhafte" Kopie der Strings in einer TStringList oder einem TArray<string>, mindestens so lange wie diese PChar's benötigt werden.
Und wer bissl
verrückt mutig ist, der könnte auch die Referenzzählung kurz anheben (+1) und am Ende über das PChar-Array und einen String-Cast die Referenzzählung aller Zeiger wieder zurücksetzen (-1).
Bzw., da hier
ANSI (warum nicht UTF-8 ?) nötig ist, ein TArray<AnsiString> / TArray<UTF8String> oder eine TAnsiStringList, zum Speichern.
PS: Wenn dieses PChar-Array "Parameters" nur als "Ausgabe" genutzt wird, dann darf man es auch gern als AnsiString-Array deklarieren.
Einer
DLL-Funktion ist es egal, da Delphi-Strings intern auch die Merkmale des PChars enthalten (Zeiger zeigt auf das erste Char und am Ende folgt eine #0 ... genauer sind es hier sogar zwei #0#0).