Announcement

Collapse
No announcement yet.

Benutzen von Klassen aus einer DLL

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Benutzen von Klassen aus einer DLL

    Hallo,
    Ich möchte aus einem Delphi-Programm eine Klasse aus einer DLL benutzen. Das Problem dabei ist: Ich habe 2 Version der DLL mit jeweils den gleichen Klassen, jedoch mit unterschiedlichen Implmentierungen, jedoch das Interface ist gleich.
    Nun möchte ich aus meinem Delphi-Programm wahlweise die eine oder die andere DLL (und die enthaltene Klasse) benutzen, d.h. dynamisch laden.
    Geht das überhapt ?
    Wenn ja, kann mir jemand sagen wie ?

    Jürgen Kortt
    ([email protected])

  • #2
    Hallo,

    in Object Pascal ist es nicht möglich, Variablen oder Klassen aus einer DLL zu exportieren - allerdings ist es zulässig, über eine <b>Schnittstellenprozedur</b> eine Variable oder eine <b>Instanz einer Klasse</b> zu exportieren. Das folgende Beispiel stammt aus meinem Buch <i>COM/DCOM mit Delphi</i>:

    Sowohl die DLL als auch das Programm müssen die gleiche abstrakte Basis-Klasse als Unit einbinden, in der alle Methoden als abstrakte, virtuelle Methoden deklariert werden:
    <pre>
    unit Obj_Unit;

    interface

    type
    TMWSt = class
    public
    function GetBrutto(const aNetto: Currency): Currency; virtual; abstract;
    procedure SetPercent(const aPercent : Integer); virtual; abstract;
    end;

    const
    MWST_VERSION = 1;

    implementation

    end.
    </pre>
    Die DLL legt einen Nachfolger der abstrakten Basisklasse an, der als <b>Instanz</b> über eine Schnittstellenprozedur exportiert wird:
    <pre>
    library MWStObj;

    uses
    SysUtils,
    Classes,
    Obj_Unit in 'Obj_Unit.pas';

    type
    TMWSt98 = class(TMWSt)
    private
    FMWStSatz : Real;
    public
    constructor Create;
    function GetBrutto(const aNetto: Currency): Currency; override;
    procedure SetPercent(const aPercent : Integer); override;
    end;

    constructor TMWSt98.Create;
    begin
    inherited Create;
    FMWStSatz := 1.15;
    Assert(MWST_VERSION = 1, 'Falsche Unit-Version!');
    end;

    function TMWSt98.GetBrutto(const aNetto: Currency): Currency;
    begin
    Result := aNetto * FMWStSatz
    end;

    procedure TMWSt98.SetPercent(const aPercent : Integer);
    begin
    FMWStSatz := 1.0 + (aPercent/100);
    end;

    { Schnittstellenprozedur }

    function CreateMWStObj: TMWSt98; stdcall;
    begin
    Result := TMWSt98.Create;
    end;

    { Export der Schnittstellenprozedur }

    exports
    CreateMWStObj resident;

    begin
    { nichts zu tun }
    end.
    </pre>
    Der Client kann nun auf die DLL zugreifen, indem er von der DLL eine Instanz des Objekts anfordert. Anstelle des statischen Imports ist auch das dynamische Laden der DLL möglich, da sich die exportierte Schnittstellenprozedur nicht von anderen DLL-Funktionen unterscheidet:
    <pre>
    function CreateMWStObj: TMWSt; stdcall external 'MWSTOBJ.DLL';

    procedure TForm1.FormCreate(Sender: TObject);
    begin
    aMWStObj := CreateMWStObj;
    end;

    procedure TForm1.FormDestroy(Sender: TObject);
    begin
    aMWStObj.Free;
    end;

    procedure TForm1.ButtonCalcClick(Sender: TObject);
    var
    cBrutto : Currency;
    begin
    cBrutto := aMWStObj.GetBrutto(StrToFloat(EditNetto.Text));
    StaticTextBrutto.Caption := Format('%m',[cBrutto]);
    end;
    </pre&gt

    Comment


    • #3
      Danke, ich werde das gleich mal ausprobieren

      Comment

      Working...
      X