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.
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:
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.
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.
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.