AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Objekt in einer DLL kapseln

Ein Thema von DelphiManiac · begonnen am 24. Apr 2007 · letzter Beitrag vom 24. Apr 2007
Antwort Antwort
Seite 1 von 2  1 2      
DelphiManiac

Registriert seit: 5. Dez 2005
742 Beiträge
 
#1

Objekt in einer DLL kapseln

  Alt 24. Apr 2007, 11:56
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!
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#2

Re: Objekt in einer DLL kapseln

  Alt 24. Apr 2007, 12:07
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.
  Mit Zitat antworten Zitat
DelphiManiac

Registriert seit: 5. Dez 2005
742 Beiträge
 
#3

Re: Objekt in einer DLL kapseln

  Alt 24. Apr 2007, 12:11
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?
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Objekt in einer DLL kapseln

  Alt 24. Apr 2007, 12:13
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
DelphiManiac

Registriert seit: 5. Dez 2005
742 Beiträge
 
#5

Re: Objekt in einer DLL kapseln

  Alt 24. Apr 2007, 12:16
Hallo Luckie,

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

Gruß
DelphiManiac
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#6

Re: Objekt in einer DLL kapseln

  Alt 24. Apr 2007, 12:18
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.
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#7

Re: Objekt in einer DLL kapseln

  Alt 24. Apr 2007, 12:22
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 von DelphiManiac:
ja bpls kann ich leider nicht nutzen, da ich die DLL von Visual Basic-Programmieren (aaah) genutzt werden soll
lol, vergiss es einfach, wenn dir deine geistige Gesundheit am Herzen liegt.
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.
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
DelphiManiac

Registriert seit: 5. Dez 2005
742 Beiträge
 
#8

Re: Objekt in einer DLL kapseln

  Alt 24. Apr 2007, 12:22
@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
  Mit Zitat antworten Zitat
DelphiManiac

Registriert seit: 5. Dez 2005
742 Beiträge
 
#9

Re: Objekt in einer DLL kapseln

  Alt 24. Apr 2007, 12:24
Dass mit den VB'lern kann ich mir leider nicht aussuchen ...
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#10

Re: Objekt in einer DLL kapseln

  Alt 24. Apr 2007, 12:31
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:47 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz