Einzelnen Beitrag anzeigen

Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#6

Re: realloc in C-Dll schlägt fehl bei Aufruf von Delphi IDE

  Alt 19. Dez 2009, 01:00
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.
fork me on Github
  Mit Zitat antworten Zitat