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.