AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi realloc in C-Dll schlägt fehl bei Aufruf von Delphi IDE
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von Mastersargon · begonnen am 18. Dez 2009 · letzter Beitrag vom 19. Dez 2009
Antwort Antwort
Benutzerbild von sx2008
sx2008

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

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
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 18:36 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-2025 by Thomas Breitkreuz