AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Kommunikation zwischen DLL und EXE

Kommunikation zwischen DLL und EXE

Ein Thema von Paul Lincke · begonnen am 11. Mai 2008 · letzter Beitrag vom 12. Mai 2008
 
Fridolin Walther

Registriert seit: 11. Mai 2008
Ort: Kühlungsborn
446 Beiträge
 
Delphi 2009 Professional
 
#7

Re: Kommunikation zwischen DLL und EXE

  Alt 11. Mai 2008, 19:05
Der hochoffizielle Weg wäre folgender:

1. Der Caller (also die Funktion bzw. Prozedur die GetData aufruft) fordert Speicher an um den String zu erhalten. Dazu muss er natürlich wissen wieviel Speicher gebraucht wird. Entweder steht dies im Vorfeld schon fest weil es eine maximal Größe für den String gibt oder aber man ermittelt die Größe über einen separaten API Call.
2. Der Caller übergibt den Buffer und die Größe dann an die aufzurufende Funktion (GetData) die entsprechend den String in den Buffer kopiert.
3. Nachdem der Caller dann mit dem String gemacht hat was immer er machen wollte, gibt er den Speicher wieder frei.

Eine Beispielimplementation findest Du hier:

Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}
uses
  windows;

const
  MyString = 'Ich bin ein toller Teststring!';

function GetData(Buffer : PChar; BufferSize : cardinal) : cardinal; stdcall;
begin
  if (BufferSize < Length(MyString) + 1) or IsBadWritePtr(Buffer, BufferSize)
    then
      // Buffer ist nicht groß genug oder wir haben keinen Schreibzugriff auf den Speicher.
      // Folglich geben wir die benötigte Größe zurück.
      result := Length(MyString) + 1
    else
      begin
        // Buffer ist groß genug, also wird er mit Nullbytes gefüllt und danach
        // wird der String rüberkopiert.
        ZeroMemory(Buffer, BufferSize);
        CopyMemory(Buffer, @MyString[1], Length(MyString));
        result := 0;
      end;
end;

var
  Data : PChar;
  DataSize : cardinal;
begin
  // Wir müssen zuerst wissen wie groß der String ist, den wir holen wollen.
  // Wenn er eine fixe (maximale) Größe hat, kann man den Schritt einfach skipen.
  DataSize := GetData(nil, 0);
  writeln('DataSize: ', DataSize);

  GetMem(Data, DataSize);
  if GetData(Data, DataSize) <> 0
    then writeln('Fehler beim Aufruf der Funktion.')
    else writeln(string(Data));

  FreeMem(Data);
  readln;
end.
Wenn Fragen da sind zum wieso oder weshalb einfach stellen .

@1234588:
Das nutzt ihm nichts, denn so wie ich seinen Code verstanden habe, möchte er von einer Funktion einen String zurück erhalten.
Fridolin Walther
  Mit Zitat antworten Zitat
 

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 13:25 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