Einzelnen Beitrag anzeigen

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, 20: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