Einzelnen Beitrag anzeigen

Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.106 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Record aus DLL "importieren"

  Alt 7. Jun 2008, 17:58
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:
  1. Du reservierst Speicher, und übergibst diese Adresse an die Funktion, damit sie dort Daten reinschreiben kann.
  2. 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;
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat