Lokale Variable als PChar übergeben
Nach oben zu Konvertierungen von String in PChar
Manchmal liegt eine lokale String-Variable vor, die durch den Aufruf einer Funktion initialisiert werden muss, die einen PChar. als Parameter entgegennimmt. Ein mögliches Vorgehen ist die Erstellung eines lokalen array of char
, das an die Funktion übergeben wird. Anschließend weisen Sie diese Variable dem String zu:
// FillBuffer ist hier eine vordefinierte Funktion
function FillBuffer(Value:Integer; Buf:PChar; Count:Integer):Integer
begin
. . .
end;
// MAX_SIZE ist hier eine vordefinierte Konstante
var
i: Integer;
buf: array[0..MAX_SIZE] of char;
S: string;
begin
i := FillBuffer(0, buf, SizeOf(buf));// behandelt buf als PChar
S := buf; //Anweisungen
end;
Dieses Vorgehen ist hilfreich, wenn der Puffer relativ klein ist, da dieser auf dem Stack zugeordnet wird. Gleichzeitig handelt es sich um eine sichere Lösung, da die Konvertierung zwischen array of char
und string
automatisch erfolgt. Nachdem buf
dem String zugewiesen wurde, wird die Länge (Length
) des Strings automatisch auf den richtigen Wert gesetzt.
Um den zusätzlichen Aufwand beim Kopieren des Puffers zu vermeiden, können Sie den String in einen PChar
umwandeln, sofern die Routine nicht voraussetzt, dass der PChar
im Speicher erhalten bleibt. Die Synchronisierung der String-Länge erfolgt jedoch nicht automatisch wie bei der Zuweisung von array of char
an string
. Sie sollten die Länge des Strings mit der Funktion Length
zurücksetzen, damit sie der tatsächlichen Länge entspricht. Wenn Sie eine Funktion verwenden, welche die Anzahl der kopierten Bytes zurückgibt, ist dies in nur einer Zeile Quelltext möglich:
var S: string;
begin
SetLength(S, MAX_SIZE);// bei Umwandlung in einen PChar darf der String nicht leer sein
SetLength(S, GetModuleFilename(0, PChar(S), Length(S)));
// Anweisungen
end;