Moin Sebastian,
diese Konstellation hast Du bei vielen
API-Funktionen auch.
Damit die Funktion etwas in den Record speichern kann gibt es zwei Möglichkeiten:
- Du reservierst Speicher, und übergibst diese Adresse an die Funktion, damit sie dort Daten reinschreiben kann.
- Du übergibst die Adresse einer Variablen, und die Funktion reserviert auch den Speicher, bevor sie Daten in den Record schreibt, und gibt dann diese Adresse zurück.
Der erste Fall ist der üblichere, der zweite tritt vornehmlich bei der LAN-Manager-
API auf.
In jedem Falle musst Du dann auch den Speicher wieder freigeben.
Beispiel:
Delphi-Quellcode:
Type
PMyRecord = ^TMyRecord;
TMyRecord = packed record
cbNameSize : DWORD; // hierüber erfährt die Funktion, wieviel Speicher für lpName reserviert wurde
lpName : PChar; // hier kann die Funktion dann etwas zurückliefern.
end;
function ImportierteDLLFunktion(const AMyRecord : PMyRecord) : Integer; stdcall; external 'DLLNAME.DLL';
procedure Irgendwas;
var
mr : TMyRecord;
begin
FillChar(mr,SizeOf(mr),0); // Kann i.d.R. entfallen, wenn man alle Felder des Records verwendet
mr.cbName := 100; // Die Funktion bekommt 99 Zeichen Speicher (zzgl. der abschliessenden 0)
mr.lpName := AllocMem(mr.cbName); // Jetzt noch den Speicher reservieren
try
// Der Funktion wird die Adresse des Records übergeben
if ImportierteDLLFunktion(@mr) = 0 then begin // mal angenommen 0 sagt aus: Alles OK
ShowMessage(mr.lpName);
end else begin
ShowMessage('Fehler');
end;
finally
FreeMem(mr.lpName,mr.cbName);
end;
end;