Hallo,
ich habe mich mal näher damit beschäftigt wie man Strings sauber an eine
DLL und wieder zurück gibt und habe festgestellt, dass ich damit wohl zu sorglos umgegangen bin wenn ich sie einfach nur als pChar deklariert habe und dann auf beiden Seiten geich wieder in Strings gewandelt habe.
In einem Artikel von Michale Puff, aber auch an anderen Orten fand ich die Lösung, dass man besser zuerst die Länge ermittelt, dann den Speicher reservier, den Wert abholt und den Speicher wieder freigibt. In etwa so
Delphi-Quellcode:
// Funktion aufrufen, um Größe des Buffers zu ermitteln
len := func1('bar', nil, 0);
Str(len, s);
Writeln('len: ' + s);
try
// Speicher anfordern
GetMem(Buffer, len + 1);
// Funktion mit Buffer aufrufen
len := func1('bar', Buffer, len + 1);
Str(len, s);
writeln(String(Buffer)+ ' [' + s + ']');
finally
// Speicher wieder freigeben
FreeMem(Buffer);
end;
Damit habe ich aber ein Problem wenn ich damit eine Funktion ausführe und von der etwas zurückgeliefert bekomme. Die würde dann ja zwei mal ausgeführt werden. Erst nach dem Ausführen weiß ich die Länge der Antwort. Jetzt könnte ich das Ergebnis in einer globalen Variablen in der
DLL zwischenspeichern und beim zweiten Aufruf nur noch den Wert abholen ohne die Funktion auszuführen. Wirklich elegant finde ich das aber nicht.
Gibt es andere Möglichkeiten ohne dass ich einen festen Bereich reserviere
Grüße
Gerd