Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Objekt in einer DLL kapseln (https://www.delphipraxis.net/90814-objekt-einer-dll-kapseln.html)

DelphiManiac 24. Apr 2007 10:56


Objekt in einer DLL kapseln
 
Hallo,

ich habe zurzeit folgendes Problem:

Ich habe eine Unit, nennen wir sie mal Geraet_API
In ihr habe ich eine Klasse zur Steuerung und Konfiguration eines Geraetes.

Sieht dann ungefähr so aus:

Delphi-Quellcode:
TGeraet.Set_GeraeteReset; // Setzt das Gerät zurück
TGeraet.Set_Seriennummer(SN:String); // speichert die Seriennummer im Gerät ab
...
Mein Problem ist nun, ich will diese Funktionen der API auslagern in eine DLL.

Wie kann ich denn in meiner DLL ein Objekt erzeugen um den Zugriff der DLL zu ermöglichen?

Danke euch!

Robert Marquardt 24. Apr 2007 11:07

Re: Objekt in einer DLL kapseln
 
Ein Objekt in einer DLL zu instantiieren ist problemlos. Man muss es halt nur explizit machen.
Probleme treten erst auf wenn man das Objekt an das Hauptprogramm gibt. DLL und Hauptprogramm haben separate Memorypools. Die Einbindung von ShareMem beseitigt diese Probleme.
Eine DLL die direkt eine Klasse implementiert ist nur in C++ moeglich und verstoesst gegen Sinn und Zweck einer DLL. Die Klassenimplementation ist naemlich Compilerspezifisch.

DelphiManiac 24. Apr 2007 11:11

Re: Objekt in einer DLL kapseln
 
Hallo,

eigentlich will ich gar nicht ein Objekt übergeben, will es nur für meine Exportierung der Funktionen nutzten.
D.h. ich will ja nicht meine ganzen Methoden in Klassen umschreiben müssen.

Wie mache ich das denn am Besten?

Luckie 24. Apr 2007 11:13

Re: Objekt in einer DLL kapseln
 
Klassen und DLLs sind nicht wirklich eine sinnvolle und glückliche Kombination und sollte möglichst vermieden werden. Gründe findest du hier im Forum. Für Delphi böten sich noch Packages an, welches eigentlich nur Delphi spezifische DLLs sind.

DelphiManiac 24. Apr 2007 11:16

Re: Objekt in einer DLL kapseln
 
Hallo Luckie,

ja bpls kann ich leider nicht nutzen, da ich die DLL von Visual Basic-Programmierern (aaah) genutzt werden soll :shock:
Mmh, heißt das im Umkehrschluss ich muss meine Unit so umschreiben, dass ich nur Funktionen ohne Klassenimplemenation habe?

Gruß
DelphiManiac

Robert Marquardt 24. Apr 2007 11:18

Re: Objekt in einer DLL kapseln
 
Ein zur DLL internes Objekt ist wirklich problemlos. Wenn das DLL API sauber sprachunabhaengig ist (also keine Delphi Strings usw), dann instantiiere einfach das Objekt.

Elvis 24. Apr 2007 11:22

Re: Objekt in einer DLL kapseln
 
Verpacke deine Klasse in ein Interface und sorge dafür, dass die Verwendung aller Eigenschaften und Parameter unabhängig vom Memorymanager sind.
Zum Beispiel WideString statt AnsiString.
Nun brauchst du nur noch eine exportierte Funktion, die dir die Interface-Referenz zurückgibt.
Nachtrag:
Zitat:

Zitat von DelphiManiac
ja bpls kann ich leider nicht nutzen, da ich die DLL von Visual Basic-Programmieren (aaah) genutzt werden soll :shock:

lol, vergiss es einfach, wenn dir deine geistige Gesundheit am Herzen liegt. :lol:
Wenn nicht:
Was du hier machen müsstest wäre eine ActiveX-Library.
Die Stubs für deine COM-Klasse lässt sich dann im TypeLib-Editor anlegen, er generiert für dich dann auch das COM-Interface und ein Dispatch-interface.
Ob du dir wirklich VB-*piep*s als Benutzer deiner Lib aufhalsen willst ist deine Entscheidung, und das dürfte auch schon der schwierigste Teil des Ganzen sein. ;)

DelphiManiac 24. Apr 2007 11:22

Re: Objekt in einer DLL kapseln
 
@Robert Marquardt

Wo genau soll ich denn das Objekt erzeugen
Delphi-Quellcode:
library DLL;

{ Wichtiger Hinweis zur DLL-Speicherverwaltung: ShareMem muss sich in der
  ersten Unit der unit-Klausel der Bibliothek und des Projekts befinden (Projekt-
  Quelltext anzeigen), falls die DLL Prozeduren oder Funktionen exportiert, die
  Strings als Parameter oder Funktionsergebnisse übergeben. Das gilt für alle
  Strings, die von oder an die DLL übergeben werden -- sogar für diejenigen, die
  sich in Records und Klassen befinden. Sharemem ist die Schnittstellen-Unit zur
  Verwaltungs-DLL für gemeinsame Speicherzugriffe, BORLNDMM.DLL.
  Um die Verwendung von BORLNDMM.DLL zu vermeiden, können Sie String-
  Informationen als PChar- oder ShortString-Parameter übergeben. }
 

uses
  SysUtils,
  Classes;
exports
 // kann ich dann sowas machen??
 Obj.Set_Seriennummer;//????

begin
// HIER????
Obj:=TGeraet.Create;//??
end

DelphiManiac 24. Apr 2007 11:24

Re: Objekt in einer DLL kapseln
 
Dass mit den VB'lern kann ich mir leider nicht aussuchen ... :stupid:

Robert Marquardt 24. Apr 2007 11:31

Re: Objekt in einer DLL kapseln
 
Exportieren kann man nur einfache Funktionen. Du musst also ein Funktions-API stricken. Das sollte einfach sein, da du ja nur genau ein Objekt in einer globalen Variablen hast.

Delphi-Quellcode:
library DLL;

uses
  SysUtils,
  Classes;

var
  Geraet: TGeraet;

function Seriennummer: Cardinal;
begin
  Result := Geraet.Seriennummer;
end;

// wie man das Objekt beim Entladen der DLL brav freigibt

procedure LibExit(Reason: Integer);
begin
  if Reason = DLL_PROCESS_DETACH then
    FreeAndNil(Geraet);
end;

exports
  Seriennummer;

begin
  DLLProc := LibExit;
  Geraet := TGeraet.Create;
end


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:24 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz