Wie rufe ich Delphi-Funktionen in einem bpl von einer ausführbaren Datei auf?

8

Ich habe eine Delphi-Anwendung, für die ich einen ziemlich einfachen Wrapper .exe geschrieben habe.

Im Grunde gab es eine DLL, die eine Reihe von Funktionen hatte, von denen ich iterativ aufrufen würde, sobald mein Wrapper das getan hatte, was er brauchte. Ich habe keine Kontrolle über diese DLL-Datei und wird es nie sein.

Nun, diese DLL ist eine BPL, und ich bin mir nicht sicher, wie ich Funktionen in dieser Datei aufrufen soll. Vielen Dank im Voraus.

    
Dan 08.09.2009, 14:20
quelle

3 Antworten

10

Die einfache Möglichkeit, Funktionen aus einem Paket zu verwenden, besteht darin, die Einheit zu verwenden, die die Funktion enthält, sie wie gewöhnlich aufzurufen und das Paket in die Liste der Laufzeitpakete Ihres Projekts aufzunehmen. Damit das funktioniert, gibt es ein paar Voraussetzungen:

  1. Ihr Projekt muss dieselbe Delphi-Version verwenden, die zum Kompilieren des Pakets verwendet wurde.
  2. Sie müssen Zugriff auf die DCU-Datei für das Gerät oder zumindest auf die DCP-Datei für das Paket haben.
  3. Das Paket muss im Suchpfad des Betriebssystems vorhanden sein, wenn das Programm gestartet wird.

Wenn Sie die dritte Anforderung nicht erfüllen können oder wenn das Paket nicht ständig geladen werden soll, können Sie stattdessen LoadPackage dafür aufrufen. Um dies zu erreichen, müssen Sie ein anderes Paket haben, das ist. Es wird sowohl von Ihrem Projekt als auch von dem Paket verwendet, das Sie laden möchten. Das Zwischenpaket bietet eine Schnittstelle (wie einige Registrierungsfunktionen, eine Variable oder eine Klasse), die das Hauptpaket verwenden kann, um der Anwendung mitzuteilen, welche Funktionen sie ausführen. Sie können die Einheit des Hauptpakets in Ihrer Anwendung nicht direkt verwenden.

Wenn Sie die ersten zwei Anforderungen nicht erfüllen können, gibt es den viel schwierigeren Weg, den Sie auch brauchen würden, wenn Ihre Anwendung nicht in Delphi oder C ++ Builder geschrieben wäre. Behandeln Sie das Paket wie eine normale DLL. Laden Sie es mit LoadLibrary . Verwenden Sie GetProcAddress , um die Funktion Initialize zu laden, und rufen Sie sie dann auf. (Denken Sie daran, dass die Aufrufkonvention register , nicht stdcall ist.) Laden Sie dann die Adresse der Funktion, die Sie aufrufen möchten, wobei der Name der Funktion so geändert wurde, dass sie Informationen zu Einheiten und Typen enthält. Rufen Sie die Funktion Finalize auf, bevor Sie FreeLibrary aufrufen. Überprüfen Sie die Quelle für LoadPackage und UnloadPackage ; Ob Sie CheckForDuplicateUnits aufrufen müssen, hängt wahrscheinlich davon ab, ob Sie die Anforderungsnummer 1 erfüllen können.

    
Rob Kennedy 08.09.2009, 15:39
quelle
2

Eine BPL ist nur eine DLL mit ein paar spezifischen Ergänzungen dazu. Sie sollten keine Probleme damit haben, Funktionen aufzurufen, wie Sie es mit der DLL gemacht haben, mit einem besonderen Vorbehalt: Die BPL muss in der gleichen Version von Delphi erstellt werden, die Sie verwenden. Dies kann ein großer Nachteil sein, wenn Sie den Quellcode nicht haben. Wenn das ein Problem für Sie ist, sollten Sie wahrscheinlich mit demjenigen sprechen, der es erstellt hat und sie bitten, es in eine DLL zurück zu verwandeln.

    
Mason Wheeler 08.09.2009 14:23
quelle
1

Ein BPL kann viele DLL-Probleme beseitigen. Wenn Sie es statisch verknüpfen können, wird die Umrandung fast durchsichtig. Wenn Sie es dynamisch laden müssen, benötigen Sie eine DLL-ähnliche Zugriffsfunktion (normalerweise eine, die ein Objekt oder eine Schnittstelle zurückgibt) und einige allgemeine Typdefinitionen (Schnittstellen). All das sollte vom Hersteller der BPL geliefert werden.

    
Henk Holterman 08.09.2009 15:05
quelle

Tags und Links