du solltest deine Funktion so gestalten das sie dir die benötigte Länge zurück gibt und das Ergebnis in den übergebenen Speicher kopiert.
ablauf wäre dann folgender (in Anwendung):
- Gib mir benötigte Länge
- größe der Variablen auf benötigten Speicher setzen
- Funktion nochmal aufrufen und benötigten Speicher übergeben
Delphi-Quellcode:
//**** DLL ******
function GetFileHash(pFileName: PChar; pBuf: Pointer; iBuflen: Integer): Integer;
stdcall;
var
sHash:
string;
begin
sHash := '
a'+#0+'
b';
result:=length(sHash);
if ((pBuf <>
nil)
and (iBufLen > 0))
then
begin
if (iBuflen > result)
then
iBufLen := result;
move(sHash[1], pBuf^, iBufLen);
end;
end;
Delphi-Quellcode:
//***Anwendung***
var
Hash: String;
Len: Integer;
begin
//benötigte Länge abfragen
Len := GetFileHash('c:\abc.txt', nil, 0);
//Buffer auf benötigte Länge setzen
SetLength(Hash, Len);
//Hash abfragen
GetFileHash('c:\abc.txt', @Hash[1], Len);
Platz für ein eventuelles 0 Byte wird nicht benötigt weil ja zurück gegeben wird wie groß die Daten sind. Wenn ein 0 Byte gewünscht ist müsste sich das der Aufrufer dazu packen aber in deinem Fall ist es ja zum Beispiel nicht notwendig.