Thema: Delphi Hardware einbinden

Einzelnen Beitrag anzeigen

Christian Seehase
(Co-Admin)

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

Re: Hardware einbinden

  Alt 30. Dez 2007, 21:40
Moin Homer,

erst einmal herzlich willkommen hier in der Delphi-PRAXiS.

Einbinden kannst Du Funktionen aus DLLs auf zwei Wegen: Statisch oder dynamisch.

Statisch heisst:
Du deklarierst die Funktion, wie eine "normale" Funktion, teilst dem Compiler aber mit, dass er für die Implementierung nicht in Deinem Programm suchen muss, sondern die Funktion in einer DLL findet.

Beispiel:

  function GetAdaptersInfo(const ApAdapterInfo : PIP_ADAPTER_INFO;const ApOutBufLen : PULONG) : DWORD; stdcall; external 'IPHLPAPI.DLLname 'GetAdaptersInfo'; Die Angabe der Aufrufkonvention (hier stdcall) sollte in der Dokumentation der DLL enthalten sein.
Mit external '<Name der DLL>' wird angegeben, wie die DLL heisst, aus der man die Funktion importieren will.
Der name der Funktion muss nur mit angegeben werden, wenn man einen Funktionsnamen verwenden will, der von dem der Funktion in der DLL abweicht (und sei es auch nur durch eine andere Gross-/Kleinschreibung). In obigem Beispiel hätte also name 'GetAdaptersInfo' entfallen können.

Dynamisch heisst:
Die Funktion wird erst zur Laufzeit tatsächlich eingebunden.

Beispiel (die gleiche Funktion wie oben, nur eben dynamisch eingebunden):

Delphi-Quellcode:
// Einen Typ deklarieren, der die Funktionsdeklaration enthält
type
  TcsGetAdaptersInfo = function(const ApAdapterInfo : PIP_ADAPTER_INFO;const ApOutBufLen : PULONG) : DWORD; stdcall;

// Eine Variable deklarieren, die die Adresse der Funktion aufnehmen soll
var
  GetAdaptersInfo : TcsGetAdaptersInfo;
  hDLL : DWORD;

// Dann muss noch die Funktionsadresse aus der DLL ermittelt werden
// Dies kann, z.B., im Implementation-Abschnitt einer Unit erfolgen

initialization
begin
  // Handle auf die DLL holen.
  // Hierbei darf auch ein Pfad angegeben werden, um die Position der gewünschten DLL genau zu bestimmen.
  hDLL := LoadLibrary('IPHLPAPI.DLL');
  if hDLL <> 0 then begin
    // wenn ein gültiges Handle (<> 0) zurückgegeben wurde, kann jetzt die Adresse der Funktion ermittelt werden
    // Wichtig: Die schreibweise (Gross-/Kleinschreibung) muss exakt eingehalten werden
    @GetAdaptersInfo := GetProcAddress(hDLL,'GetAdaptersInfo');
    if @GetAdaptersInfo = nil then begin
      MessageBox(0,'GetAdaptersInfo nicht gefunden','FEHLER',MB_ICONERROR or MB_OK);
      fFatalError := true;
    end;
    // Wenn kein Fehler aufgetreten ist, kann die Funktion, jetzt so benutzt werden, wie jede andere auch.


// Später muss dann die DLL auch wieder freiggegeben werden

finalization
begin
  if hDLL <> 0 then begin
    FreeLibrary(hDLL);
  end;
Es empfiehlt sich auf jeden Fall auch die Dokumentation zu den Funktionen zu lesen (z.B. MSDN-Library durchsuchenLoadLibrary)

Bei der statischen Methode hat man zwar weniger zu schreiben, hat aber auch den Nachteil, dass das Programm gar nicht erst startet (bzw. man erhält eine Fehlermeldung, und das Programm beendet sich gleich wieder), wenn die Funktion nicht importiert werden kann.
Wenn man eine Funktion dynamisch importiert, kann man beim Programmstart auf derartige Probleme eingehen, und evtl. Alternativen verwenden, zur Nachinstallation auffordern, oder einfach den Funktionsumfang des Programmes einschränken.

[EDIT]
Um herauszufinden, welche Funktionen enthalten sind, müsstest Du wohl mal die Dokumentation studieren.
Wie diese dann korrekt eingebunden werden können (z.B., Aufrufkonvention) kannst Du wohl auch den genannten Beispielen entnehmen
[/EDIT]
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