Zitat von
Mastersargon:
Dafür muß der Speicher in der Funktion natürlich angepasst werden, weshalb das Feld von 'packet', dessen Adresse vorher schon initialisiert wurde, mit 'realloc' verlängert wird. Zunächst betragen die Längen testweise max. 20 Bytes.
Warum so umständlich mit realloc?
Bei Benützung von DLLs ist es üblich (und notwendig) den Speicher vorher zu reservieren.
Delphi-Quellcode:
var
data:string;
data_len : integer;
packet : string;
packet_len : integer;
begin
data := 'Testdaten...x';
data_len := Length(data);
packet_len := 2 * data_len; // es wird die doppelte Länge erwartet
SetLength(packet, packet_len); // Speicher reservieren
send(data_len, PChar(data), packet_len, PChar(packet)); // funktion aufrufen
// Ergebnis ist in packet
Wenn man vorher nicht weiss, wieviel Speicher das Ziel benötigt ist es üblich, die Funktion zweimal aufzurufen.
Diese Technik wird in der Window
API öfter verwendet.
Die
DLL-Funktion berechnet dann lediglich die benötigte Länge und schreibt natürlich nicht auf den Zielpuffer (der ja nil ist).
Delphi-Quellcode:
begin
data := 'Testdaten...x';
data_len := Length(data);
packet_len := 0;
send(data_len, PChar(data), packet_len, nil); // funktion aufrufen, Zielpuffer ist nil
// die benötigte Länge steht jetzt in packet_len
SetLength(packet, packet_len); // Speicher reservieren
send(data_len, PChar(data), packet_len, PChar(packet)); // nochmal aufrufen, diesmal mit Zielpuffer und korrekter Länge
Ich verwende sehr gerne AnsiStrings als Puffer; das ist sehr bequem und Delphi-like.