Frage

Ich habe eine Klasse in einer Einheit. Normalerweise, wenn ich den Algorithmus seiner Methoden geändert, ich habe es neu zu kompilieren und den Patch als Ganzes zu liefern. Ich denke, die Instanz der Klasse mit DLL zu erstellen. Nach der Suche in delphi.about.com, fand ich, dass anstelle DLL zu verwenden, ich BPL verwenden kann. Es ist eine DLL für Delphi. Das Problem ist, fast alle Beispiele, die ich nur gefunden wird, zu sagen, wie eine Funktion zu exportieren. Ich möchte dynamisch die BPL laden, und wann immer ich die BPL ersetzen, kann ich den aktuellen Algorithmus der Klasse erhalten, nicht nur die Funktionen, die ich exportieren.

Artikel gelesen haben:
- http://delphi.about.com/od/objectpascalide/a/bpl_vs_dll HTM
- Plugins System für Delphi-Anwendung - bpl vs dll - http://delphi.about.com/library/weekly/aa012301a.htm

Jede URL oder SAMPLE wie eine BPL von Grund auf neu zu erstellen, eine Komponente zu verkapseln oder eine Klasse wird sehr geschätzt.


Lieber Experte,

Angenommen, ich habe Code wie folgt:

unit unitA;

interface

type
  B = class(TObject)
  public
    procedure HelloB;
  end;

  A = class(TObject)
  public
    function GetB: B;
    function HelloA: String;
    procedure Help;
  end;

  implementation

  uses
      Dialogs;

  { B }

   procedure B.HelloB;
   begin
     ShowMessage('B');
   end;

  { A }

  function A.GetB: B;
  begin
    Result := B.Create;
  end;

  function A.HelloA: String;
  begin
    Result := 'Hello, this is A';
  end;

  procedure A.Help;
  begin
    //do something
  end;

  end.

Ich möchte alle öffentlichen Methoden von A. exportieren Wie es sich um eine DLL zu machen? Wie man es von einem anderen Gerät zu verwenden, wo es zu importieren? sagen wir mal:

 var a: A;

 a := A.Create;
 a.GetB;
 showMessage(a.HelloA);

A nicht in der Einheit erklärt (es in der DLL ist). Bitte beraten.


Hurra. Ich habe es gestern Abend. Alles, was ich tun muß, ist das Objekt eine Schnittstelle machen implementieren, die in der Anrufereinheit verwendet wird, um die Instanz des Objekts durch die DLL zurück zu fangen.

Vielen Dank.

War es hilfreich?

Lösung

Das Problem mit einer Klasse in einer externen Datei setzt, ist, dass die Hauptanwendung eine Möglichkeit wissen, muss es zu verweisen. Es wird entweder von einer Basisklasse absteigen, die die Methoden alle notwendigen wie virtuelle Methoden aussetzt, oder eine Schnittstelle zu implementieren, die alle Funktionen enthält, die Sie von ihm brauchen.

Wenn Sie bereits wissen, was die Schnittstelle des Objekts aussehen soll, und alles, was Sie zu ändern ist Implementierungsdetails wie interne Algorithmen, wahrscheinlich die einfachste Sache wäre, um Ihre Klasse eine Schnittstelle zu machen implementieren und steckt es in einem DLL dass exportiert eine Funktion, die eine Instanz dieser Schnittstelle zurückgibt. Auf diese Weise brauchen Sie nicht zu brechen Ihre app in Pakete zu kümmern, was ein großes Problem sein kann.

Andere Tipps

Mason genagelt es schon, aber lassen Sie mich näher ausführen, warum BPLs sind nicht das, was Sie suchen. BPLs ist ein Mittel für die Delphi IDE-Komponenten zu laden, die die gleichen Speichermanager und RTL teilen. (Typ Identität arbeitet fast transparent mit BPLs)

Allerdings sind die Abhängigkeiten, die Sie in fast immer inakzeptabel gebunden bekommen. Mit Ausnahme der IDE, die nicht verschiedene Versionen von RTL und VCL ohnehin verarbeiten kann.

Wenn Sie nur Verweise zwischen Ihrer Anwendung Schnittstelle und vollzieht ihren DLLs, dann müssen Sie nicht RTL teilen, VCL oder freigegebene Pakete überhaupt.

Es bedeutet auch, dass Sie einige DLLs in einer anderen Sprache (C ++, C #, FPC, eine andere Delphi-Version) schreiben können, und noch Gegenstände verwenden. Was kann verlockend sein, wenn Sie nicht wollen, zu portieren Ihre wichtigsten app wollen aber trotzdem vorhandene Bibliotheken verwenden, die für Delphi nicht verfügbar ist, oder Ihre Version von Delphi.

Ich sehe nichts in der Problembeschreibung was darauf hindeutet, Sie ausdrücklich etwas brauchen würden aus dem Paket zu exportieren, oder dass Sie es zur Laufzeit dynamisch geladen werden müßten. Stattdessen ist es ausreichend, dass Ihre Funktionen in einer Laufzeitpaket befinden, die separat vom Hauptprogramm ersetzt werden können.

Starten Sie ein neues Paket Projekt und bewegen Einheit Ihre Klasse in diesem Projekt zusammen mit anderen Einheiten es hängt davon ab. Kompilieren Sie das Projekt. Wenn der Compiler über warnt „implizit, einschließlich“ alle anderen Einheiten, fügen Sie diejenigen auf das Paket auch.

Entfernen Sie nun eine der Packungseinheiten aus dem EXE-Projekt. Es sollte keine Einheiten sein, die Mitglieder beider Projekte sind. Als nächstes schalten Sie das Kontrollkästchen „mit Laufzeitpakete bauen“ in Projektoptionen Ihres EXE. Fügen Sie Ihr Paket auf das Semikolon getrennte Liste von Paketnamen. Die RTL und VCL-Pakete werden wahrscheinlich auch auf dieser Liste sein.

beiden Projekte Kompilieren, und Sie sind fertig.

Wenn Sie Änderungen an Ihre Klasse Implementierung zu machen, können Sie das Paket nur neu kompilieren und eine neue Version an Kunden senden. Das Programm wird automatisch die neuen Änderungen erhalten, wenn Sie die Originaldatei mit dem neuen zu ersetzen. Das Paket wird in dem Programm der Importtabelle aufgelistet, so dass das Betriebssystem automatisch die BPL-Datei laden, wenn es die EXE lädt. Die EXE benötigen keinen speziellen Code ausführen, um das Paket zu laden.

Delphi kann DLL erstellen Funktionen oder BPL exportieren Komponente zu exportieren.

Sie können die Komponente erstellen, kompilieren (die gleichen Compiler-Einstellungen wie in Ihrem Haupt-app) und Delphi wird .bpl erstellen. Importieren Sie dann diese Komponente zu Delphi und übersetzen Sie Ihre App mit dieser compomponent als Paket.

Meine Erfahrung mit Komponenten mit Delphi 4 erstellt hat bewiesen, dass eine, große Anwendung zuverlässiger ist als Anwendung mit separaten .bpls. Es war multithreaded Server und es funktionierte, wenn kompiliert eigenständige Ordnung, während nach kurzer Zeit abgestürzt, wenn mit Paketen zusammengestellt. Ich hoffe, dass neuere Versionen von Delphi in diesem Bereich verbessert werden.

Seien Sie die Speicherverwaltung bewusst (in App nicht kostenlos memeory in Paket und umgekehrt zugeordnet) und Compiler-Einstellungen.

Wenn Sie about.com dann wird dieser Link nützlich sein: Einführung in Pakete; BPLs sind spezielle DLLs!

BPLs haben ihre Nutzung. Zum Beispiel, wenn Sie eine sehr große Anwendung wie ein Erp zu machen, müssen Sie versuchen, BPLs ernsthaft zu verwenden.

In der anderen Seite sind BPLs nicht verantwortlich für Absturz-Anwendungen. Bad Nutzung von BPLs tut es.

Sie die MAF-Komponenten versuchen können, behandeln sie Plugins und vieles mehr für Sie ohne zusätzlichen Code. Kommt mit Tutorials und einer Demo-Anwendung mit Quelle.

http://www.maf-components.com

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top